如果使用所有平台通用的所有标准C库编写C程序,无论是Unix(任何风格)还是Windows(即stdio.h,math.h等),并使用标准编译器(即GCC)并在任何一个相同的CPU arch上运行它,为什么二进制文件不会在符合所有上述标准的不同机器上运行?
当我在X86 Mac上编译C程序时,只使用标准库,为什么不能在Linux或Windows下在相同的CPU架构上运行该编译的二进制文件?
是否因为在C运行时期间发生了特定于平台的库链接或者是什么?
答案 0 :(得分:5)
可执行二进制文件不仅仅是所需源代码和库的机器语言的组合,而是跳过现在的答案仍然是否定的:您链接的库特定于它们将要运行的系统继续前进。例如,你质疑mac vs linux ...每个系统都有自己的方式来调用陷阱进入系统(例如I / O),如果你的可执行文件有链接到它的那些项目(而不是通过共享)对象),你从一开始就注定要失败。
回到“特定于系统”...不仅像系统调用这样的问题,而且有多个可执行的二进制格式,这将导致你在很多时候不仅仅是轻微的痛苦。例如,OS X使用“Mach-O”二进制格式,而Linux使用“ELF”格式。当然,在这些文件中,您可以找到相同可执行文件的相似代码,但是您会发现该数据的不同二进制布局使得在一个系统上看起来是直接的,而另一个系统上完全未知。许多示例中的一个...... Mach-O格式在可执行文件中嵌入了其动态加载的库所在的位置 - 例如,相对于加载可执行文件的绝对位置或位置。这个概念(据我所知)不是ELF或Windows“PE”格式。
答案 1 :(得分:5)
忽略问题第10行以下的文本墙,以及二进制文件与操作系统无关的一些基本原因:
所有这些实际上都是由操作系统定义的ABI(应用程序二进制接口)的一部分(如果操作系统实现由于例如专利问题而无法实现,则有时是编译器。)
我能想到的最后一个原因:
答案 2 :(得分:0)
另请阅读此Is C++ platform dependent?