【问题标题】:C++ compiling and linkingC++ 编译和链接
【发布时间】:2013-01-26 11:31:05
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c++ compilation linker


    【解决方案1】:

    Google, first hit.

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          【解决方案4】:

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

          • gcc –c MyProgram.c

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

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

          • gcc MyProgram.o –o MyProgram

          注意没有未解决的引用!

          插图:

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

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

          【讨论】:

            【解决方案5】:

            严格来说。答案 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。然后,链接器采用此“机器代码”并解析符号,就像您在之前的一些错误中听到的那样。

            【讨论】:

              猜你喜欢
              • 2021-09-18
              • 1970-01-01
              • 2013-09-04
              • 2014-01-18
              • 1970-01-01
              • 2012-11-19
              • 2019-01-30
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多