C++工具链编译流程:预处理→编译→汇编→链接
请描述 C++ 源文件到可执行文件的完整编译流程(预处理、编译、汇编、链接四个阶段),每个阶段的主要任务、生成的文件格式、以及 GCC 各阶段对应的命令行选项。
回答
屠龙少年
四阶段流程:
1. 预处理(Preprocessing):
- 展开
#include、#define、条件编译#if。 - 删除注释,处理
#line等指令。 - 输出
.i文件(文本)。 - 命令:
g++ -E main.cpp -o main.i
2. 编译(Compilation):
- 词法分析、语法分析、语义分析。
- 生成抽象语法树(AST),优化后生成汇编代码。
- 输出
.s文件(汇编文本)。 - 命令:
g++ -S main.i -o main.s(或-S main.cpp一步)
3. 汇编(Assembly):
- 将汇编代码转为机器指令(二进制)。
- 生成重定位目标文件
.o(ELF/Mach-O/COFF)。 - 命令:
g++ -c main.s -o main.o(或-c main.cpp)
4. 链接(Linking):
- 符号解析:将符号引用与定义关联。
- 重定位:合并各目标文件段,补全地址。
- 生成可执行文件(默认
a.out)。 - 命令:
g++ main.o helper.o -o program
单步命令:
g++ main.cpp helper.cpp -o program # 一键完成
查看各阶段产物:
g++ -v main.cpp # 详细显示各阶段命令
g++ -fdump-tree-all main.cpp # 编译中间表示