源文件(.c/.cpp) → 预处理(展开头文件,将对应的宏进行替换,把注释去掉)得到扩展源代码文件 → 编译器(gcc/g++)进行编译得到汇编文件(.s) → 汇编器进一步处理得到二进制文件(.obj/.o) → 链接器(将二进制文件进行链接)得到一个打包好的可执行文件。
1. 编写源代码
-
源文件:程序员编写的源代码文件,通常是.c(C语言)或.cpp(C++语言)文件。
2. 预处理(Preprocessing)
-
工具:预处理器(例如,C预处理器cpp)。
-
过程:
-
展开头文件:将#include指令引用的所有内容插入源文件。
-
宏替换:将#define定义的宏替换为相应的值或代码。
-
移除注释:删除源代码中的所有注释。
-
结果:产生一个“扩展源代码”文件,通常是临时的,不会实际保存。
3. 编译(Compilation)
-
工具:编译器(例如,GCC对于C,G++对于C++)。
-
过程:
-
将扩展的源代码转换为汇编语言代码。
-
这一步涉及语法分析、语义分析、优化等多个子步骤。
-
结果:生成汇编代码文件,通常是.s文件。
4. 汇编(Assembly)
-
工具:汇编器(例如,as)。
-
过程:
-
将汇编语言代码转换为机器代码。
-
每条汇编指令被转换为机器指令。
-
结果:生成目标文件(Object File),通常是.o(在Unix/Linux系统)或.obj(在Windows系统)。
5. 链接(Linking)
-
工具:链接器(例如,ld)。
-
过程:
-
将一个或多个目标文件与库文件(如静态库或动态库)链接在一起。
-
解决符号引用,例如函数和全局变量的地址。
-
处理静态和动态链接。
-
结果:生成可执行文件,通常是没有扩展名的文件(在Unix/Linux系统)或.exe文件(在Windows系统)。
6. 最终的可执行文件
-
说明:链接器输出的最终产品是一个可执行文件,它包含了程序运行所需的所有机器代码和资源。
总结
整个过程是将高级语言编写的源代码转换为机器能够直接执行的二进制代码。这个过程涉及多个阶段和工具,每个阶段都对代码进行特定的转换和优化。这个工具链的核心组成部分是预处理器、编译器、汇编器和链接器。