7

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

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

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

但我越想,我就越感到困惑。

我的问题是:

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

b) 如果代码在 CP1 上使用 C11 标准但在 CP2 上唯一的编译器是 C99,这有关系吗?我假设一旦代码被编译/汇编,这无关紧要。

c)问题没有指定共享/动态链接库。所以这只有在程序不依赖 .dll/.so/ .dylib 文件的情况下才会真正起作用,否则 CP2 也需要这些文件。

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

哈!

4

3 回答 3

3

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

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

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

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

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

于 2013-01-13T02:41:35.757 回答
1

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

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

于 2013-01-13T03:07:00.650 回答
0

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

A: 然后你可以在两台电脑上运行相同的.exe

Q:如果在CP1上编译了一个C程序,为了把它移到CP2上,是否需要转移源代码?

A: 不需要。如果你想重新编译,你只需要源代码。如果它是不同的、不兼容的 CPU 和/或操作系统,您只需要重新编译。

程序执行通常根本不需要“目标文件”:

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

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

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

Finally, "scripts" do not need to be recompiled. You may copy the script freely from computer to computer. But each computer must have an "interpreter" to run the script: a Perl script needs a Perl interpreter, a Python script a python interpreter, and so on.

于 2013-01-13T05:54:25.300 回答