预处理(Preprocess).
使用Preprocessor Directives将一些代码替换成另一些代码. 例如将include替换成它指向的文件包含的代码.
编译成目标文件(Compiation).
需要两个回合(pass):
- 将代码解析成树(parse tree). 这个过程中还会执行类型检查.
- 将parse tree 转换成object文件. 可以先转换成汇编文件, 然后机器码文件.
链接(link)
将obj文件link可执行文件. 检查目标文件中用到的变量与函数是否存在. 它们可以存在于单个或多个obj文件中, 也可存在于library文件, 如.so中.
当linker碰到一个声明时, 有两种情况, 对应两种处理:
- 如果之前已经解析过, 万事OK. (具体情况不了解)
- 如果没有解析过, 则在系统路径和用户提供的路径中寻找. 编译好的库文件有索引, 所以不用search整个文件, 只需要在索引中search就行. 找到后, 将定义所在的模块, 即整个obj文件而非整个库文件链接到可执行文件中.
需要注意的是:
- 编译时一般会自动执行链接过程, 可以提供额外的include路径(具体是哪个参数TODO).
- 标准库文件的路径,如
iostream
, 不用指定. - 最后还会为每个可执行文件加一个启动模块, 用于完成程序启动前的准备工作, 如内存空间分配等.