计算机之间的C目标文件兼容性

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

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

我的直觉回答是目标文件应该足够了。 C代码由编译器翻译为汇编程序并由汇编程序汇编成机器代码。 由于架构共享相同的机器代码和操作系统,所以我没有发现问题。

但是我越想到它,我就开始越感到困惑。

我的问题是:

a)由于它涉及目标文件而不是可执行文件,因此我假设没有链接。 在连接CP2时会不会出现任何问题?

b)如果代码使用CP1上的C11标准,但CP2上唯一的编译器是C99,会影响吗? 一旦代码被编译/汇编,我认为这是无关紧要的。

c)该问题没有指定共享/动态链接库。 因此,如果程序不依赖于.dll / .so / .dylib文件,那么这只能真正起作用,否则这些也将在CP2上需要。

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

HALP!


答案是,这取决于。 当您编译C程序并移动目标文件以链接到其他计算机时,它应该可以工作。 但是由于诸如字节顺序或名称混乱之类的因素,您的程序可能无法按预期运行,甚至可能在您尝试运行时崩溃。

C11不被支持的C99编译器,但如果源已经被编译并安装它并不重要。

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

你可以得到一个支持EABI的编译器,所以你不会遇到这些问题。 支持EABI的编译器创建与其他编译器生成的代码兼容的对象代码,从而允许开发人员将使用一个编译器生成的库与使用不同编译器生成的对象代码链接起来。

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


a)我已经听说过使用术语“目标文件”来指代链接的二进制文件 - 尽管它有点不准确。 所以也许他们的意思是“二进制文件”。 如果它有不同的编译器,我会说在不同的机器上链接可能会有问题 - 除非目标文件格式是标准化的,我不确定。

b)使用不同的标准甚至编译器对二进制代码无关紧要 - 如果它是静态链接的。 如果它依赖于动态库中的函数,则可能会出现问题。 哪些答案c):是的,这将是一个问题。 如果程序没有正确版本中的所有动态库,程序将不会启动。 取决于链接模式(静态与动态),再次。


问:假设计算机CP1和CP2共享相同的操作系统和机器语言。

答:然后你可以在两台计算机上运行相同的.exe

问:如果在CP1上编译C程序,为了将其移动到CP2,是否需要传输源代码

答:不可以。如果您想重新编译,您只需要源代码。 如果它是不同的,不兼容的CPU和/或OS,则只需要重新编译。

程序执行通常不需要“对象文件”:

http://en.wikipedia.org/wiki/Object_files

目标文件是一个包含可重定位格式机器代码的文件,通常不可直接执行。 目标文件由汇编器,编译器或其他语言翻译器生成,并用作链接器的输入。

“可执行程序”可能需要一个或多个“共享库”(又名.dll's)。 在这种情况下,应用相同的限制:共享库(如果尚未驻留)必须与.exe一起复制,并且还必须与CPU和操作系统兼容。

最后,“脚本”不需要重新编译。 您可以免费将脚本从计算机复制到计算机。 但是每台计算机都必须有一个“解释器”来运行该脚本:一个Perl脚本需要一个Perl解释器,一个Python脚本和一个Python解释器,等等。

链接地址: http://www.djcxy.com/p/68411.html

上一篇: C object file compatibility between computers

下一篇: Facebook wallpost image won't render when posting through the Open Graph API