在使用gcc编译程序时,编译过程可以被细分为四个阶段:
·预处理
·编译
·汇编
·链接
1.预处理阶段
预处理功能(头文件、宏定义、条件编译都在预处理阶段完成)
·将源文件中以”include”格式包含的文件复制到编译的源文件中。
·用实际值替换用“#define”定义的字符串。
·根据“#if”后面的条件决定需要编译的代码。
2.编译、优化阶段
经过预编译得到的输出文件中,只有常量;如数字、字符串、变量的定义,以及C语言的关键字,如main,if,else,for,while,{,},+,-,*,\等等。
编译程序所要作得工作就是通过词法分析和语法分析,在确认所有的指令都符合语法规则之后,将其翻译成等价的中间代码表示或汇编代码。
编译阶段必须通过三个步骤
词法分析,主要负责检查关键字。(关键字检查)
语法分析,主要负责检查程序中的语法是否正确。(语法检查)
语义分析,主要负责检查程序中语句的逻辑意义是否正确。(逻辑意义检查)
3.汇编阶段
汇编阶段的任务是把汇编程序翻译成CPU可以识别的二进制文件,该文件又称为目标文件。
4.链接阶段
虽然目标文件已经可以被CPU直接识别,但是单个目标文件一半无法完成运行。原因在于一个程序往往是有多个源文件组成,每个源文件只对应一个目标文件。
例如:
一个”Hello word!” c程序,为什么不能直接运行hello.c,原因是hello.c使用了stdio.h对应的库函数,所以必须要把目标文件和函数库文件链接在一起才能运行。
链接阶段的任务就是把程序中所有目标文件和所需的库文件都链接在一起,最终生成一个可以直接运行的文件,称为可执行文件。