C++是如何编译的

How is C++ compiled

我正在研究一些(非常)低级的编程,但并不是所有的事情对我来说都是完全清楚的。我首先通过 gcc 创建一个 运行 的 .cpp(或 .c)文件来创建一个 elf 或目标文件,但什么是目标文件?当我使用 "as" 编译器时,我得到了目标文件,但是这些是如何使用的?当我们可以有一个直接的二进制文件时,拥有一个目标文件的目的是什么?

这个site上对这个问题有很清楚的解释。我也把它粘贴在下面。但我强烈建议你看看网站上的图表。这将使您对正在发生的事情有更好的高级理解。

用 C++ 编译源代码文件是一个四步过程。例如,如果您有一个名为 prog1.cpp 的 C++ 源代码文件,并且您执行编译命令

g++ -Wall -ansi -o prog1 prog1.cpp 编译过程如下所示:

  1. C++ 预处理器将包含的头文件的内容复制到源代码文件中,生成宏代码,并用它们的值替换使用#define 定义的符号常量。
  2. C++ 预处理器生成的扩展源代码文件被编译成平台的汇编语言。
  3. 编译器生成的汇编代码被汇编成平台的目标代码。
  4. 汇编程序生成的目标代码文件与用于生成可执行文件的任何库函数的目标代码文件链接在一起。

通过使用适当的编译器选项,我们可以在任何阶段停止这个过程。

  1. 要在预处理器步骤后停止进程,可以使用 -E 选项:

    g++ -E prog1.cpp 扩展后的源代码文件将打印在标准输出上(默认为屏幕);如果您愿意,可以将输出重定向到一个文件。请注意,扩展后的源代码文件通常非常大 - 一个 20 行的源代码文件可以轻松生成 20,000 行或更多行的扩展文件,具体取决于包含哪些头文件。

  2. 要在编译步骤后停止进程,可以使用 -S 选项:

    g++ -Wall -ansi -S prog1.cpp 默认情况下,名为 filename.cpp 的源文件的汇编代码将放置在名为 filename.s.

  3. 的文件中
  4. 要在组装步骤后停止进程,可以使用 -c 选项:

    g++ -Wall -ansi -c prog1.cpp 默认情况下,名为 filename.cpp 的源文件的汇编代码将放在名为 filename.o

  5. 的文件中