预处理:展开头文件、宏替换、条件编译,生成.i文件;2. 编译:将预处理后的代码转为汇编语言.s文件;3. 汇编:将汇编代码转为二进制目标文件.o;4. 链接:合并目标文件与库,解析符号引用,生成可执行程序。

c++程序从源代码变成可执行文件,要经过一系列步骤。这个过程看似简单,其实每个阶段都有其作用和意义。了解整个流程,有助于理解程序如何运行、错误如何产生,以及优化和调试的方向。
1. 预处理(Preprocessing)
这是编译的第一步,由预处理器完成。它处理源码中以#开头的指令,比如#include、#define、#ifdef等。
主要任务包括:
- 将头文件内容插入到 #include 所在位置
- 展开宏定义(#define)
- 根据条件编译指令决定保留或删除某段代码
- 删除注释,添加行号信息以便调试
输出结果是一个扩展后的纯C++代码文件,通常以 .i 为后缀。例如:
立即进入“豆包AI人工智官网入口”;
立即学习“豆包AI人工智能在线问答入口”;
2. 编译(Compilation)
这一步把预处理后的代码转换成汇编语言。编译器会进行词法分析、语法分析、语义分析和优化,最终生成对应平台的汇编代码。
关键工作包括:
- 检查语法是否正确(如括号匹配、类型使用)
- 将高级语言结构翻译为低级表示
- 进行初步的代码优化(如常量折叠)
输出是汇编文件,一般以 .s 结尾。命令示例:
g++ -S main.i -o main.s
3. 汇编(Assembly)
汇编器将汇编代码(.s 文件)翻译成机器能直接识别的二进制指令,也就是目标文件(Object file)。目标文件通常是ELF格式(linux)或COFF格式(windows),扩展名为 .o 或 .obj。
这个阶段不涉及函数间的链接,只是“翻译”,所以每个源文件独立生成一个目标文件。
执行命令如下:
g++ -c main.s -o main.o
或者直接从源码一步到位:
g++ -c main.cpp -o main.o
4. 链接(Linking)
多个目标文件和库文件需要合并成一个可执行文件,这就是链接的作用。它解决符号引用问题,比如你调用了printf,但定义在标准库中,链接器负责找到并接入这个函数。
主要任务有:
- 合并所有目标文件的代码段和数据段
- 解析外部符号(函数、变量)的地址
- 处理静态库和动态库的依赖
最终生成可执行文件。例如:
g++ main.o util.o -o program
如果用一条命令编译:
g++ main.cpp -o program
实际上背后已经自动完成了预处理、编译、汇编和链接四个步骤。


