首先,我想说明这个问题与学校/家庭作业有关.
假设计算机CP1和CP2共享相同的操作系统和机器语言.如果在CP1上编译C程序,为了将其移动到CP2,是否需要传输源代码并在CP2上重新编译,或者只是传输目标文件.
我的直觉答案是目标文件应该足够了. C代码由编译器转换为汇编代码,并由汇编程序汇编为机器代码.因为架构共享相同的机器代码和操作系统,所以我没有看到问题.
但是我想的越多,我开始变得越困惑.
我的问题是:
a)由于它引用了目标文件而不是可执行文件,我假设没有链接.在CP2上链接时会出现任何问题吗?
b)如果代码在CP1上使用C11标准,但CP2上唯一的编译器是C99,这是否重要?我认为一旦编译/汇编代码,这就无关紧要了.
c)该问题未指定共享/动态链接库.所以这只有在程序没有依赖于.dll / .so / .dylib文件的情况下才能真正起作用,否则CP2上也需要这些.
我觉得有这么多陷阱,考虑到问题是多么模糊,我现在觉得简单地重新编译会更安全.
HALP!
解决方法
答案是,这取决于.当您编译C程序并将目标文件移动到另一台计算机上的链接时,它应该可以工作.但是由于诸如
endianness或
name mangling之类的因素,您的程序可能无法正常工作,甚至在您尝试运行它时可能会崩溃.
C99编译器不支持C11,但是如果源代码已经编译和汇编则无关紧要.
只要在一台机器上使用库编译源代码,就不需要库来链接或运行另一台计算机上的文件(仅限静态库,动态库必须在您运行的计算机上)申请上).这就是说,你应该使程序独立,这样你就不会遇到程序无法正常工作或崩溃的问题.
你可以得到一个支持EABI的编译器,这样你就不会遇到这些问题.支持EABI的编译器创建与其他此类编译器生成的代码兼容的目标代码,从而允许开发人员将使用一个编译器生成的库与使用不同编译器生成的目标代码链接.
我曾尝试过这样做,但不是很多,而不是最近.因此,我的信息可能不是100%准确.