编译过程分为四个阶段,如下图所示:

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、静态编译
静态编译使用的是静态库文件进行编译,最终的可执行文件包括了整个静态库文件,体积较大,但是该可执行程序可以在其他机器上运行。
注意:
该篇文字是对以前学习的整理,摘抄出处已经不清楚了,若有侵权,请告知,立删!
编译过程详解
本文详细介绍了编译过程的四个阶段:预编译、编译、汇编和链接,以及动态编译与静态编译的区别。预编译阶段处理宏替换、条件预编译指令和头文件,编译阶段进行语法检查和代码优化,汇编阶段将源代码转换为机器代码,链接阶段合并多个目标文件并解析符号。动态编译依赖于运行环境,而静态编译则包含完整库文件。
616

被折叠的 条评论
为什么被折叠?



