参考资料
程序从代码到运行的全过程
C++ 编程的生态系统
下图以构建动态链接库为例。
C++ 的动态链接库(dll)和应用程序在构建层面上的典型区别:应用程序在构建中通常会包含能够让操作系统的应用加载器所执行的函数,以及 main() 函数,因此,同样的代码下,应用程序的大小会比 dll 文件大。
翻译
注意:一般来说,每一个源文件会生成一个二进制的目标文件。
注意:在 C++ 里,翻译是基于翻译单元(Translation Unit)进行的。
翻译阶段概述
步骤(参考链接):
- 映射源字符:源文件的各个字节映射到基本源字符集的字符中。
注:C++23 起,映射到翻译字符集的字符中。
- 拼接行:每个紧接着新行字符的反斜杠字符实例都会被删除,将物理源行拼接成逻辑源行。
- 词法分析。
- 预处理:
1) 执行预处理器。
2)
#include
指令所引入的每个文件都经历阶段 1 到 4 的处理,递归执行。 3) 此阶段结束时,所有预处理指令都应从源(代码)移除。 - 确定字符串字面量的公共编码。
- 拼接字符串字面量。
- 编译。
- 实例化模板。
- 链接。
总结:阶段 1-6 是预处理阶段,输出翻译单元;阶段 7-8 是编译阶段,输出已完成翻译的翻译单元(也就是二进制目标文件);阶段 9 是链接阶段。
例子
以下程序生成了 41625 行的翻译单元文件。