编译过程预览
预处理
- 预处理(Prepressing) : -E 表示只进行预处理, 即 : gcc –E hello.c –o hello.i
- 展开所有 #define 定义的宏
- 处理所有条件预编译指令,如 #if, #ifdef
- 递归的将 #include 的文件插入到该预编译文件中
- 删除各类注释
- 添加行和文件标识,如 #2 “hello.c” 2 ,用于调试或编译出错报警
- 保留所有的 #pragma 编译指令,编译器要使用
- 对于C++ 来说,预处理后的文件扩展名是 .ii
编译
- 编译(Compilation): gcc –S hello.i –o hello.s
编译过程就是把预处理完的文件进行一系列词法分析,语法分析,语义分析及优化后生成相应的汇编代码文件. - 现在的gcc 把预处理和编译两个步骤合成一个步骤,C语言使用一个叫做 cc1 的程序来完成,C++则是 cc1plus ,位于 /usr/libexec/gcc/x86_64-redhat-linux/4.1.2/
- gcc 实际上是这些后台程序的包装,它会根据参数要求去调用 cc1(cclplus), 汇编器 as 和链接器 ld
链接
- 链接(Linking):解决一个程序被分割成多个模块后,模块间最后如何组合成一个单一程序的问题.
- 链接的主要任务是把各个模块之间相互引用的部分处理好,使各个模块之间能正确的衔接.