这个问题在这里已经有了答案:
Why are "Executable files" operating system dependent?
(6 个回答)
1年前关闭。
这更像是一个理论问题。我是 Comp sci 专业的,对低级编程非常感兴趣。我喜欢了解事情在幕后是如何运作的。我的专长是编译器设计。
无论如何,当我正在开发我的第一个编译器时,我正在发生一些令人困惑的事情。
当您使用 C/C++ 编写程序时,人们所知道的传统做法是,编译器会神奇地将您的 C/C++ 代码转换为该机器的 native 代码。
但是这里没有加起来。如果我针对 x86 架构编译我的 C/C++ 程序,似乎相同的程序应该在具有相同架构的任何计算机上运行。但这不会发生。您需要为 OS X 或 Linux 或 Windows 重新编译代码。(再次针对 32 位与 64 位)
我只是想知道为什么会这样?我们在编译 C/C++ 程序时不是针对 CPU 架构/指令集吗? Mac OS 和 Windows 操作系统可以在完全相同的架构上运行。
(我知道 Java 和类似的目标是 VM 或 CLR,所以这些不算)
如果我对此给出了最佳答案,我会说 C/C++ 必须编译为特定于操作系统的指令。但是我读到的每个来源都说编译器以机器为目标。所以我很困惑。
最佳答案
Don't we target the CPU architecture/instruction set when compiling a C/C++ program?
不,你没有。
我的意思是,您正在为 CPU 指令集进行编译。但这并不是编译的全部。
考虑最简单的“你好,世界!”程序。它所做的就是调用
printf
, 对?但是没有“printf”指令集操作码。那么......究竟会发生什么?嗯,这是 C 标准库的一部分。其
printf
函数对字符串和参数进行一些处理,然后...显示它。这是怎么发生的?好吧,它将字符串发送到标准输出。好吧...谁控制它?操作系统。而且也没有“标准输出”操作码,因此将字符串发送到标准输出涉及某种形式的操作系统调用。
并且操作系统调用没有跨操作系统标准化。几乎每一个标准库函数都可以做一些你不能用 C 或 C++ 自己构建的东西,它会与操作系统对话以至少完成它的一些工作。
malloc
?内存不属于你;它属于操作系统,您也许可以拥有一些。 scanf
?标准输入不属于你;它属于操作系统,您可以从中读取。等等。您的标准库是通过调用 OS 例程构建的。并且这些操作系统例程是不可移植的,因此您的标准库实现是不可移植的。所以你的可执行文件中有这些不可移植的调用。
最重要的是,不同的操作系统对“可执行文件”的外观有不同的想法。毕竟,可执行文件不仅仅是一堆操作码。您认为所有这些常量和预初始化在哪里
static
变量被存储?不同的操作系统有不同的启动可执行文件的方式,可执行文件的结构是其中的一部分。
关于c++ - 为什么需要为每个操作系统重新编译 C/C++?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61644911/