C ++编译和链接

时间:2013-01-26 11:31:05

标签: c++ compilation linker

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

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

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

在我看来,正确的答案是A,但我没有任何来源证明它。

5 个答案:

答案 0 :(得分:4)

Google, first hit.

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

编译除了创建目标文件外没有任何作用,这意味着将C / C ++源代码转换为机器代码。

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

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

答案 3 :(得分:1)

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

  • gcc -c MyProgram.c

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

链接:将对象文件与外部引用合并为可执行文件

  • gcc MyProgram.o -o MyProgram

注意没有未解析的引用!

插图:

enter image description here

其中 libc.a是标准的C库,它会自动通过gcc链接到您的程序中。

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

答案 4 :(得分:0)

严格来说,是的。答案A.

但是为了让你看到整个画面,让我们说你已经定义了一些功能。然后是the compiler writes the machine code code of that function at some address, and puts that address and the name of the function in the object ".o" file where the linker can find it。然后,链接器接受此“机器代码”并解析符号,就像您在之前的错误中听到的那样。