我发现了一个关于在 C++ 中编译和链接的问题,但我不知道哪个答案是正确的。和朋友讨论过,意见不一。这是一个问题:
为了运行用 C++ 语言编写的程序,它的源代码是:
(A)编译为机器代码,
(B)编译并链接到机器代码
我认为正确的答案是 A,但我没有任何来源可以证明它.
我发现了一个关于在 C++ 中编译和链接的问题,但我不知道哪个答案是正确的。和朋友讨论过,意见不一。这是一个问题:
为了运行用 C++ 语言编写的程序,它的源代码是:
(A)编译为机器代码,
(B)编译并链接到机器代码
我认为正确的答案是 A,但我没有任何来源可以证明它.
还需要链接来创建独立的可执行文件。
您需要链接您生成的代码以使其成为可执行文件。对于简单的程序,编译器通过在编译过程结束时调用链接器来为您执行此操作。
适当的编译器只是将 C 代码转换为汇编器(经典 C 编译器),然后用汇编器进行汇编,或者直接转换为机器代码(许多现代编译器)。机器代码通常生成为“目标文件”,它们不是“可执行文件”,因为它们引用外部单元 - 例如当您调用 printf() 时。可以编写完全独立的 C 代码,但您通常仍需要组合多个目标文件,而且它当然需要以正确的方式“格式化”以生成可执行文件 - 这是一个不同的文件 -格式比目标文件[虽然通常相当相似]。
编译除了创建目标文件之外什么都不做,这意味着将 C/C++ 源代码转换为机器代码。
链接过程是从多个 obj 文件创建可执行文件。因此,要运行应用程序/可执行文件,您还必须链接它。
在编译期间,编译器不会抱怨不存在的函数或损坏的函数,因为它会假设它可能定义在另一个对象(源代码文件)中。链接器验证所有函数及其存在,所以如果你有一个损坏的函数,你会在链接过程中出错
编译:接受输入C/C++-code
并生成机器码(目标文件)
请注意,目标文件不包含所有外部引用!
链接:将目标文件与外部引用组合成一个可执行文件
请注意,没有未解决的引用!
插图:
libc.a
标准库在哪里C
,它通过gcc
.
我刚刚注意到你的问题是关于 c++ 的,同样的概念也在 c++ 中,如果你理解了这一点,你也会明白它在 c++ 中是如何工作的
严格来说。答案 A。
但是为了让您看到全貌,假设您已经定义了一些功能。然后编译器将该函数的机器代码写入某个地址,并将该地址和函数的名称放在链接器可以找到的对象“.o”文件中。然后,链接器采用此“机器代码”并解析符号,就像您在之前的一些错误中听到的那样。