clang编译共5个核心步骤:1.预处理(生成cpp-output)、2.编译(生成ir)、3.后端优化(生成汇编)、4.汇编(生成object)、5.链接(生成image);-ccc-print-phases可查看阶段链,-###显示实际调用命令。

用 -ccc-print-phases 看清 Clang 编译的每一步
Clang 不是单个黑盒程序,而是驱动多个子工具(预处理器、编译器、汇编器、链接器)的调度器。想看清它到底干了什么,最直接的方式是让 Clang 自己打印出完整阶段链:clang++ -ccc-print-phases main.cpp
输出类似:
+- 0: input, "main.cpp", c++
+- 1: preprocessor, {0}, cpp-output
+- 2: compiler, {1}, ir
+- 3: backend, {2}, assembler
+- 4: assembler, {3}, object
+- 5: linker, {4}, image
每一行代表一个阶段,数字是序号,花括号里是前驱输入,最后是该阶段输出类型。注意:ir 是 LLVM bitcode(.bc),不是汇编;assembler 阶段才真正生成 .s;linker 阶段才调用 ld 或 lld。
用 -### 查看实际调用的底层命令
-ccc-print-phases 告诉你“做什么”,而 -### 告诉你“具体怎么做的”——它会打印 Clang 实际 fork 出去的每一个子命令,包括路径、参数、隐式选项:
clang++ -### main.cpp
你会看到类似这样的输出(截取关键部分):
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
"/usr/bin/clang" "-cc1" "-triple" "x86_64-pc-linux-gnu" ... "-E" "main.cpp" "/usr/bin/clang" "-cc1" "-triple" ... "-S" "-o" "main.s" "main.cpp" "/usr/bin/as" "--64" "-o" "main.o" "main.s" "/usr/bin/ld" ... "-o" "a.out" "main.o" "/usr/lib/x86_64-linux-gnu/crt1.o" ...
这些才是真实执行的命令。你会发现:
• -cc1 是 Clang 的核心编译器前端,负责 AST 构建和 IR 生成
• -E 对应预处理,-S 对应生成汇编,-c 对应生成目标文件
• 链接时不仅有你的 .o,还有 crt1.o、libc_nonshared.a 等隐式链接项
• 所有宏定义(如 _GLIBCXX_USE_CXX11_ABI=1)、头文件路径(-I/usr/include/c++/12)都会在这里暴露
分步执行时要注意 -x 和输入后缀的隐式语言推断
当你用 clang++ -E main.cpp 或 clang++ -S main.cpp 时,Clang 会根据文件后缀自动设语言模式(-x c++)。但如果你重命名文件或从 stdin 读入,就容易出错:
- 用
clang++ -E -x c++ -读取标准输入,否则-默认当 C 处理 - 对预处理后的
.ii文件,必须显式加-x c++-cpp-output,否则 Clang 会误判为纯 C -
clang++ -S main.ii会报错,正确写法是clang++ -S -x c++-cpp-output main.ii - 不加
-x时,.c文件走 C 模式(不启用 STL),.cpp才走 C++ 模式
调试信息缺失?检查 -g 是否被优化覆盖
你加了 -g 却在 LLDB 里看不到变量?大概率是优化干扰了调试信息生成:
-
-O2或更高会使局部变量被寄存器分配或完全消除,-g无法描述已不存在的东西 - 必须搭配
-O0使用-g才能保证变量、行号、作用域完整映射 -
-fno-omit-frame-pointer在-O2下也建议加上,否则栈回溯可能断裂 - 验证是否真嵌入了调试信息:
readelf -wi a.out | head -n 10,看到DW_TAG_subprogram或DW_TAG_variable才算成功
Clang 的编译过程不是线性流水线,而是一张带条件分支的依赖图;每个阶段的输出格式(.ii、.bc、.s)都可能成为下一步的合法输入,但类型必须严格匹配,稍有偏差就会静默失败或语义错位。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










