编译与链接
什么是编译
C++ 是一种静态类型的编程语言,CPU 无法直接执行文件中的各行命令, 这意味着在程序执行之前需要通过 编译过程 将其源代码转换为机器码. 编译器会读取程序的源文件 .cpp, 将其翻译为可执行文件 ELF, ELF 文件可以经过操作系统进行加载执行
编译的过程
常见的编译过程分为四个过程: 编译预处理, 编译, 汇编, 链接
- 编译预处理:在预编译过程中主要处理源代码中的预处理指令,比如引入头文件
#include,去除注释,处理所有的条件编译指令#ifdef, #ifndef, #else, #elif, #endif,宏的替换#define,添加行号,保留所有的编译器指令; - 编译:针对预处理后的文件进行词法分析、语法分析、语义分析、符号汇总、汇编代码生成,并针对程序的结构或者特定的 CPU 平台进行优化,其中涉及的过程较为复杂。简单来说编译的过程即为将
.cpp源文件翻译成.s的汇编代码; - 汇编:将汇编代码
.s翻译成机器指令.o文件,一个.cpp文件只会生成一个.o文件; - 链接:汇编程序生成的目标文件即为
.o文件,单独的.o文件可能无法执行。因为一个程序可能由多个源文件组成,此时就存在多个.o文件。文件 A 中的函数引用了另一个文件 B 中定义的符号或者调用了某个库文件中的函数,这就需要 链接处理。那链接的目的就是将这些文件对应的目标文件连接成一个整体,从而生成一个可被操作系统加载执行的ELF 程序文件。链接的过程较为复杂,如有兴趣可以参考:「Computer Systems: A Programmer’s Perspective」。