前言
在C语言中源代码不能直接生成可执行文件,需要经过编译和链接两个过程才能生成可执行文件,编译又分为预处理,编译和汇编三个过程,下面我将对这四个过程进行详细解释。
1.预处理
经过预处理,源文件(.c)和头文件(.h)会被预处理为后缀为.i的中间文件;
在预处理阶段,预处理器主要处理#开头的预编译指令:
- #include指令,将包含的头文件内容替换至预编译指令位置;
- #define,删除所有的#define,并展开宏定义,进行简单的文本替换;
- 删除所有注释;
- 处理其他条件编译指令,如#if,#else等;
注意:经过预编译的.i文件中不再包含宏定义,宏定义以及全部展开,当我们不确定宏定义的指令中是否包含正确时,可以通过打开.i文件查看来确认。
2.编译
编译就是将预处理获得的.i文件进行一系列处理,包括词法分析、语法分析、语义分析及优化,生成汇编代码文件(.s)。
3.汇编
汇编就是将汇编代码转变成对应的机器指令,每一条汇编代码都会对应一条机器代码,生成对应的目标文件(.o)。
4.链接
经过汇编后形成的目标文件并不能直接转变为可执行文件,还需要进行链接过程。在链接过程中,链接器会把由汇编器生成的目标代码和程序需要的其他附加代码整合在一起,生成最终可执行的程序。
在C语言中,每一个(.c)源文件都会生成一个(.o)目标文件,链接器会将所有的.o文件链接到一起,生成最终的可执行文件。