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