编译过程分为四个阶段,如下图所示:
1、预编译
将.c文件生成.i文件,在预处理器里主要做以下处理
a、进行宏替换,也就是展开所有的宏定义,并将#define删除
b、处理条件预编译指令
c、处理各种头文件
d、删掉所有注释
e、添加文件标识和行号
f、保留#progma
注意:此时不会判断语法等错误
2、编译
将.i文件转为.s文件,在编译器里主要做以下处理
主要 将进行语法的处理,判断,将提示警告、错误等信息,并进行代码优化。
3、汇编
将.s文件转为.o文件,在汇编器里主要做以下处理
注意:.o文件又被称为可重定位的二进制文件
(重定位的解释可参考:https://blog.csdn.net/yesyes120/article/details/78944991)
a、将我们写的代码翻译成机器能够识别的语言即二进制代码
4、链接
将.o文件生成.exe文件,被称为可执行目标程序,在链接器里主要做以下处理
a、合并段(相同段之间)和符号表,整个链接过程就是将几个输入目标文件加工合并成一个输出文件。
b、 进行符号解析:在符号引用的地方找到符号定义的地方
c、分配地址和空间
d、 符号的重定位
拓展:动态编译/静态编译
1、动态编译
动态编译使用的是动态库文件进行编译,我们的程序在编译时会调用动态库中相关用到的函数,注意两者之间只是建立联系,最终的可执行程序并没有包括动态库,运行的时候调用即可,这就使得可执行程序体积较小,但是该可执行程序很难在另一台机器上运行,除非这台机器也有相关环境。
2、静态编译
静态编译使用的是静态库文件进行编译,最终的可执行文件包括了整个静态库文件,体积较大,但是该可执行程序可以在其他机器上运行。
注意:
该篇文字是对以前学习的整理,摘抄出处已经不清楚了,若有侵权,请告知,立删!