g++分步编译四阶段为:1.预处理(-E→.ii),2.编译(-S→.s),3.汇编(-c→.o),4.链接(默认→可执行文件);各阶段需匹配参数如-I、-std=、-pthread等,精准定位错误。

怎么用 g++ 一步步走完预处理、编译、汇编、链接
直接跑 g++ main.cpp -o main 是最省事的,但一旦出错(比如头文件找不到、符号未定义),你根本不知道卡在哪一环。分步执行能精准定位问题阶段,也方便调试宏展开或检查生成的汇编逻辑。
四个阶段对应四个关键选项:-E → -S → -c → 默认链接。每步输出文件后缀和内容类型都不同,不能跳着来。
-
g++ -E main.cpp -o main.ii:只做预处理,输出纯文本.ii文件。可直接用less main.ii查看#include <iostream></iostream>展开了多少行、#define是否被正确替换、#ifdef DEBUG块是否被剔除 -
g++ -S main.ii -o main.s:把预处理后的文本转成汇编代码。注意:这步会做语法检查,如果main.ii里有std::cout 拼写错误,就在这里报错,而不是等到链接 -
g++ -c main.s -o main.o:生成二进制目标文件。这步失败通常意味着架构不匹配(比如在 ARM 上用 x86 汇编)或符号引用非法(如调用了未声明的函数) -
g++ main.o -o main:链接。如果用到了std::vector但没加-std=c++17,或者链接了 C 库却没加-lstdc++,错误会集中爆发在这里
g++ 分步时哪些参数容易漏掉或配错
分步不是简单套命令,很多坑藏在隐式依赖里。比如你写了 #include <string></string>,但没告诉编译器标准库路径,-E 阶段就会报 No such file or directory。
- 预处理阶段必须显式加
-I:比如头文件在./include下,得写g++ -E -I./include main.cpp -o main.ii;否则#include "myheader.h"找不到 - 编译阶段要指定 C++ 标准:
g++ -S -std=c++20 main.ii -o main.s。不加-std=可能默认用 c++98,导致auto或constexpr报错 - 汇编阶段对输入很敏感:
g++ -c main.s要求main.s是合法汇编,但如果你之前用gcc -S(不是g++)生成的.s,可能缺 C++ ABI 相关符号,链接时会失败 - 链接阶段缺库是高频问题:哪怕只用了
std::thread,也得加-pthread;用std::filesystem得加-lstdc++fs(GCC 9+)
为什么先编译成 .o 再链接,比一次全编更可靠
大型项目动辄几十个 .cpp 文件,每次改一行就全量重编,太慢。分步的核心价值是复用中间产物——只要头文件没变,.o 就不用重生成。
立即学习“C++免费学习笔记(深入)”;
- 修改
utils.cpp?只需重新跑g++ -c utils.cpp -o utils.o,再g++ main.o utils.o -o program即可 - 如果某
.cpp依赖的头文件被删了,g++ -c xxx.cpp会立刻失败,不会等到最后链接时报一堆“undefined reference”让你猜哪来的 -
.o文件自带符号表,用nm xxx.o能查哪些函数被定义、哪些只是声明(带U标记),这对排查链接错误特别直接 - 注意:
g++ -c不检查跨文件符号,所以main.o里调用foo()即使foo.o还没编译,也不会报错——这是链接阶段的事
实际调试时,哪个阶段该看什么文件
别盲目翻日志。每个阶段的输出文件就是你的诊断依据,但要看对地方。
- 预处理后卡住?打开
main.ii,搜error:或直接看最后一行有没有# 1 "main.cpp"——没有说明#include层级太深或路径错了 - 编译阶段报
expected ';' before '}' token?不是语法错,大概率是main.ii里宏展开后多删了一个分号,或条件编译漏了#endif - 汇编阶段失败且提示
invalid instruction?检查main.s第几行,对照g++ -S生成的汇编,看是不是用了目标平台不支持的指令(比如在老 CPU 上用了 AVX) - 链接时报
undefined reference to `std::string::...'?先确认main.o里有没有这个符号:nm main.o | grep string;没有,说明编译时没启用 C++ 标准库支持
分步不是为了炫技,是让错误从模糊的“编译失败”变成具体的“第 3 行宏展开后类型不匹配”。越早暴露问题,越少浪费时间在重复编译上。


















