预处理:展开头文件、宏替换、条件编译,生成。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
实际上背后已经自动完成了预处理、编译、汇编和链接四个步骤。
基本上就这些。整个流程虽然被一条命令隐藏了,但每一步都不可或缺。理解它们,能帮你更快定位 编译错误 、链接失败或 性能瓶颈。


