计算机之间的C对象文件兼容性

kbi*_*irk 7 c compiler-construction assembly compatibility linker

首先,我想说明这个问题与学校/家庭作业有关.

假设计算机CP1和CP2共享相同的操作系统和机器语言.如果在CP1上编译C程序,为了将其移动到CP2,是否需要传输源代码并在CP2上重新编译,或者只是传输目标文件.

我的直觉回答是目标文件应该足够了.C代码由编译器转换为汇编代码,并由汇编程序汇编为机器代码.因为架构共享相同的机器代码和操作系统,所以我没有看到问题.

但是我想的越多,我开始变得越困惑.

我的问题是:

a)由于它引用了目标文件而不是可执行文件,我假设没有链接.在CP2上链接时会出现任何问题吗?

b)如果代码在CP1上使用C11标准,但CP2上唯一的编译器是C99,这是否重要?我假设一旦代码编译/组装,这是无关紧要的.

c)该问题未指定共享/动态链接库.所以这只有在程序不依赖于.dll/.so/.dylib文件时才能真正起作用,否则CP2上也需要这些.

我觉得有这么多陷阱,考虑到问题是多么模糊,我现在觉得简单地重新编译会更安全.

HALP!

syb*_*0rg 3

答案是,这取决于情况。当您编译 C 程序并将目标文件移动到另一台计算机上链接时,它应该可以工作。但由于字节顺序名称修改等因素,您的程序可能无法按预期运行,甚至在您尝试运行它时可能会崩溃。

C11编译器不支持C99,但源代码是否已编译和汇编并不重要。

只要源代码是在一台计算机上使用库进行编译的,您就不需要库来链接或运行另一台计算机上的文件(仅静态库,动态库必须位于您运行的计算机上)应用程序上)。也就是说,您应该使程序独立,这样您就不会遇到与以前相同的问题,即程序无法按预期工作或崩溃。

您可以获得支持EABI 的编译器,这样您就不会遇到这些问题。支持 EABI 的编译器创建的目标代码与其他此类编译器生成的代码兼容,从而允许开发人员将一个编译器生成的库与另一编译器生成的目标代码链接起来。

我以前曾尝试过这样做,但次数不多,最近也没有尝试过。因此,我的信息可能不是100%准确。