c++ - 为什么需要为每个操作系统重新编译 C/C++?

标签 c++ c winapi compilation

这个问题在这里已经有了答案:





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/

相关文章:

c++ - 具有常量/非常量指针类型的模板的自动类型转换

c - 在c中使用free()出现段错误

c - 如何将字符串C中的每个特定字符替换为另一个?

c++ - 如何将 IPropertyBag 持久化到磁盘

c++ - 如何绘制粗线的轮廓?

python - 如何在拖放时隐藏窗口中的光标(可能是python,或其他语言)

c++ - *新总是错的。总是

c++ - QLocalServer 不会启动传入连接

c++ - 请求非类类型的成员

c - 替换多个\t