CodeWalk

C++工具链编译流程:预处理→编译→汇编→链接

作者:屠龙少年 · 2026-05-30 12:55

请描述 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  # 编译中间表示