程序编译的四个阶段

编译过程可以分为四个阶段:

预处理(-E)

预处理就是对源程序中的伪指令(以#开头的指令)和特殊符号进行处理的过程。伪指令包含宏定义指令,条件编译指令和头文件包含指令。gcc对C源文件进行预处理后会输出 .i 文件。

主要处理规则如下:

(1)将所有#define删除,并且展开所有的宏定义。

(2)处理所有条件编译指令。如#if、#ifdef等

(3)处理#include预编译指令,将被包含的文件插入该预编译指令的位置。

(4)删除所有的注释

(5)添加行号和文件标识,以便于编译时编译器产生调试用的行号信息及编译时产生编译错误或警告时能够显示行号信息

(6)保留所有的#pragma编译器指令,因为编译器需要使用它们。

编译(-S)

编译就是把预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后生成相应的汇编代码。使用gcc进行编译时,默认情况下,不输出该文件,生成的汇编文件是 .s 文件

汇编(-c)

汇编就是将汇编代码转变为机器可以执行的二进制代码,每一个汇编语句几乎都对应一条机器指令。汇编相对于编译过程比较简单,根据汇编指令和机器指令的对照表一一翻译即可。

链接

在成功汇编之后,就进入链接阶段。链接主要是为了解决多个文件之间符号引用的问题。编译时编译器只对单个文件进行处理,如果该文件里面需要引用到其他文件中的符号,那么这时在这个文件中该符号的地址是没法确定的,只能等链接器把所有的目标文件链接到一起,才能确定最终的地址,最终生成可执行文件。

你可能感兴趣的:(Linux,C++)