0

我发现了一个关于在 C++ 中编译和链接的问题,但我不知道哪个答案是正确的。和朋友讨论过,意见不一。这是一个问题:

为了运行用 C++ 语言编写的程序,它的源代码是:

(A)编译为机器代码,
(B)编译并链接到机器代码

我认为正确的答案是 A,但我没有任何来源可以证明它.

4

5 回答 5

4

谷歌,第一击。

还需要链接来创建独立的可执行文件。

于 2013-01-26T11:34:13.517 回答
1

您需要链接您生成的代码以使其成为可执行文件。对于简单的程序,编译器通过在编译过程结束时调用链接器来为您执行此操作。

适当的编译器只是将 C 代码转换为汇编器(经典 C 编译器),然后用汇编器进行汇编,或者直接转换为机器代码(许多现代编译器)。机器代码通常生成为“目标文件”,它们不是“可执行文件”,因为它们引用外部单元 - 例如当您调用 printf() 时。可以编写完全独立的 C 代码,但您通常仍需要组合多个目标文件,而且它当然需要以正确的方式“格式化”以生成可执行文件 - 这是一个不同的文件 -格式比目标文件[虽然通常相当相似]。

于 2013-01-26T11:36:19.683 回答
1

编译除了创建目标文件之外什么都不做,这意味着将 C/C++ 源代码转换为机器代码。

链接过程是从多个 obj 文件创建可执行文件。因此,要运行应用程序/可执行文件,您还必须链接它。

在编译期间,编译器不会抱怨不存在的函数或损坏的函数,因为它会假设它可能定义在另一个对象(源代码文件)中。链接器验证所有函数及其存在,所以如果你有一个损坏的函数,你会在链接过程中出错

于 2013-01-26T11:36:55.533 回答
1

编译:接受输入C/C++-code并生成机器码(目标文件)

  • gcc –c MyProgram.c

请注意,目标文件不包含所有外部引用!

链接:将目标文件与外部引用组合成一个可执行文件

  • gcc MyProgram.o –o 我的程序

请注意,没有未解决的引用!

插图:

在此处输入图像描述

libc.a标准库在哪里C,它通过gcc.

我刚刚注意到你的问题是关于 c++ 的,同样的概念也在 c++ 中,如果你理解了这一点,你也会明白它在 c++ 中是如何工作的

于 2013-01-26T11:39:39.507 回答
0

严格来说。答案 A。

但是为了让您看到全貌,假设您已经定义了一些功能。然后编译器将该函数的机器代码写入某个地址,并将该地址和函数的名称放在链接器可以找到的对象“.o”文件中。然后,链接器采用此“机器代码”并解析符号,就像您在之前的一些错误中听到的那样。

于 2013-01-26T12:45:48.490 回答