构建
构建build 是 ide里的词,构建 = 编译 + 链接。
一个gcc 1.c,其实是: 预处理 + 编译 + 汇编 + 链接
预编译
源文件,被预编译器cpp
编译成: .i
文件。 gcc -E 1.c -o 1.i
- 展开所有的#define宏定义
- 将#include所引用的文件,插入到 这条执行的位置。(这个过程是递归的,因为可以多层引用include)
- 删除所有的注释
- 添加行号和文件名标识:
#1 "1.cpp"
,以便编译器产生错误后 可以显示行号的错误信息。 - 保留#prama指令!! 因为编译器要使用它。
编译
他大致有2个事情:
- 代码的优化
- 汇总所有的符号 到 符号表。
符号表非常重要! 你编译出错的信息,就要依靠于他
所有.data段
里的变量名 都会产生符号;.text段
里的函数名 也会产生符号(局部变量不会产生符号)
.i
文件,被编译成:.s
汇编代码 gcc -S 1.i -o 1.s
进行:词法、语法、语义 分析,指令优化。
现在的gcc,会把预编译 和 编译,合为一个步骤。由名为cc1
的程序 来完成。
这个程序,在c叫做cc1
,在c++叫做cc1plus
,在java叫做jc1
。
汇编
.s
文件,被汇编成:.o
机器指令目标文件 gcc -c 1.s -o 1.o
由: 汇编器as完成。
每一条汇编语句, 都对应一条机器指令。 所以,as的汇编过程 没有编译器复杂,不用做语义分析 指令优化等。
只需将 汇编指令 和 机器指令,一一对照翻译即可。
思考&