编译与链接

什么是编译

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」。

什么是链接

链接的种类

静态链接

动态链接