编译器的工作流程

Posted 今天我们聊点什么

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编译器的工作流程相关的知识,希望对你有一定的参考价值。

一 配置(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)开发者可以在编译阶段选择可执行文件连接外部函数库的方式,到底是静态连接(编译时连接),还是动态连接(运行时连接)。

以上是关于编译器的工作流程的主要内容,如果未能解决你的问题,请参考以下文章

ts 准备工作,及自动编译

Android的编译打包流程详解

编译器警告是不是会导致智能感知停止工作?

编译器是如何工作的?

编译器是怎样工作的?

在 GitLab CI Docker 工作流程中应该在哪里编译 c++ 应用程序?