基本过程
基本过程为:
预编译 -> 编译 -> 链接
预编译:
- 替换所有的宏
- 处理所有的预编译指令例如:#ifdef
- 处理#include,将包含的文件插入目标文件中。其中自己定义的文件一般用#include“xxx.h”,表示从程序当前目录寻找文件。而库文件则一般用#include,表示从系统目录寻找文件。
- 过滤所有的注释。
- 保留所有的#program指令。
编译:
- 将预处理的文件做一系列的词法,语法分析。
- 产生汇编代码。
在此过程中,还要提供3张表。分别是未解决符号表,导出符号表,地址重定向表。
未解决符号表:未解决符号表里面存放的是定义不在本编译单元里的符号及其地址。例如用extern声明的变量。
导出符号表:里面存放的是本编译单元具有定义,并且可以提供给别的编译单元使用的符号及其地址
地址重定向表:存放了本编译单元所有对自身的地址引用的记录。
这些表会在链接阶段被处理。
链接:
- 将链接的模块独立的编译并组装起来。