小白学习大型C++源码项目系列之编译器的工作过程

文章目录

    • 编译器的工作过程
      • 配置(configure)
      • 确定标准库和头文件的位置
      • 确定依赖关系
      • 头文件的预编译(precompilation)
      • 预处理(Preprocessing)
      • 编译(Compilation)
      • 连接(Linking)
      • 安装(Installation)
      • 操作系统连接
      • 生成安装包
      • 动态连接(Dynamic linking)

编译器的工作过程

小白学习大型C++源码项目系列之编译器的工作过程_第1张图片
小白学习大型C++源码项目系列之编译器的工作过程_第2张图片

配置(configure)

编译器在开始工作之前,需要知道当前的系统环境,比如标准库在哪里、软件的安装位置在哪里、需要安装哪些组件等等。这是因为不同计算机的系统环境不一样,通过指定编译参数,编译器就可以灵活适应环境,编译出各种环境都能运行的机器码。这个确定编译参数的步骤,就叫做"配置"(configure)。

确定标准库和头文件的位置

源码肯定会用到标准库函数(standard library)和头文件(header)。

确定依赖关系

编译顺序保存在一个叫做makefile的文件中,里面列出哪个文件先编译,哪个文件后编译。而makefile文件由configure脚本运行生成,这就是为什么编译时configure必须首先运行的原因。

头文件的预编译(precompilation)

只需编译一次,不必每次用到的时候,都重新编译了

预处理(Preprocessing)

预编译完成后,编译器就开始替换掉源码中bash的头文件和宏。

编译(Compilation)

编译器就开始生成机器码。对于某些编译器来说,还存在一个中间步骤,会先把源码转为汇编码(assembly),然后再把汇编码转为机器码。转码后的文件称为对象文件(object file)。

连接(Linking)

make命令的作用,就是从第四步头文件预编译开始,一直到做完这一步。
编译器的下一步工作,就是把外部函数的代码(通常是后缀名为.lib和.a的文件),添加到可执行文件中。这就叫做连接(linking)。这种通过拷贝,将外部函数库添加到可执行文件的方式,叫做静态连接(static linking),后文会提到还有动态连接(dynamic linking)。

安装(Installation)

将可执行文件保存到用户事先指定的安装目录,创建目录、保存文件、设置权限等。

操作系统连接

make install命令,就用来完成"安装"和"操作系统连接"这两步。可执行文件安装后,必须以某种方式通知操作系统,让其知道可以使用这个程序了。

生成安装包

编译器还必须有生成安装包的功能。通常是将可执行文件(连带相关的数据文件),以某种目录结构,保存成压缩文件包,交给用户。

动态连接(Dynamic linking)

运行期间(runtime)开发者可以在编译阶段选择可执行文件连接外部函数库的方式,到底是静态连接(编译时连接),还是动态连接(运行时连接)。

你可能感兴趣的:(C++)