如何编译C ++

时间:2016-09-26 15:06:56

标签: compilation elf low-level

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

1 个答案:

答案 0 :(得分:2)

关于这个site,这个问题有一个非常明确的解释。我也把它贴在下面。但我强烈建议你看一下网站上的图表。这将使您更好地了解正在发生的事情。

在C ++中编译源代码文件分为四个步骤。例如,如果您有一个名为prog1.cpp的C ++源代码文件,则执行编译命令

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

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

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

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

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

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

    3. 要在组装步骤后停止该过程,可以使用-c选项:

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