1 预处理 prepressing
预处理过程主要是处理源代码中的以“#”开始的预处理指令。
- 删除所有的“#define”,并且炸奶所有的宏定义。
- 处理所有有条件的预处理指令,#if #ifedf #elif #else #endif
- 处理#include指令,将被包含的文件插入到该预处理的指令的位置,此处的文件中有可能还会包括其他的文件,这个过程会用递归的方式。
- 删除注释
- 添加行号以及文件名标识
- 保留所有的#pragma编译器指令,
2 编译 compilation
编译过程就是把预处理的文件进行一系列的词法分析,语法分析,语义分析以及优化后产生相应的汇编代码文件。这个部分是最核心的部分在整个过程中。
3 汇编 assembly
汇编器将汇编代码转变成机器可以执行的指令。
经过以上三步处理之后,生成.o文件
GCC 命令参数
https://www.runoob.com/w3cnote/gcc-parameter-detail.html
-E 预处理
-S //预处理 编译
-c 仅生成.o文件//预处理 编译 汇编
-o 生成可执行文件// 预处理 编译 汇编 链接
4 链接 linking
https://zhuanlan.zhihu.com/p/83716863
4.1 静态链接
直接把.o文件组合起来,方便,易于调试,但是占用空间比较大。
4.2 动态链接
动态链接的本质是把链接的过程推迟到运行时再进行。