C/C++的编译过程

预处理(Preprocess).

使用Preprocessor Directives将一些代码替换成另一些代码. 例如将include替换成它指向的文件包含的代码.

编译成目标文件(Compiation).

需要两个回合(pass):

  1. 将代码解析成树(parse tree). 这个过程中还会执行类型检查.
  2. 将parse tree 转换成object文件. 可以先转换成汇编文件, 然后机器码文件.

链接(link)

将obj文件link可执行文件. 检查目标文件中用到的变量与函数是否存在. 它们可以存在于单个或多个obj文件中, 也可存在于library文件, 如.so中.
当linker碰到一个声明时, 有两种情况, 对应两种处理:

  1. 如果之前已经解析过, 万事OK. (具体情况不了解)
  2. 如果没有解析过, 则在系统路径和用户提供的路径中寻找. 编译好的库文件有索引, 所以不用search整个文件, 只需要在索引中search就行. 找到后, 将定义所在的模块, 即整个obj文件而非整个库文件链接到可执行文件中.

需要注意的是:

  • 编译时一般会自动执行链接过程, 可以提供额外的include路径(具体是哪个参数TODO).
  • 标准库文件的路径,如iostream, 不用指定.
  • 最后还会为每个可执行文件加一个启动模块, 用于完成程序启动前的准备工作, 如内存空间分配等.
posted @ 2016-12-24 14:40  宁静是一种习惯  阅读(193)  评论(0编辑  收藏  举报