-v用于查看Clang完整工具链调用过程,输出预处理、编译、汇编、链接各阶段命令及隐式参数;-verbose需通过-Wl,-verbose透传给链接器,仅显示链接细节。

-v 和 -verbose 都能开启详细输出,但行为不同,选错会导致信息量远低于预期。
用 -v 查看完整工具链调用过程
这是最常用也最实用的选项。它会打印 Clang 调用预处理器、编译器、汇编器、链接器的完整命令行,包括隐式传入的路径、默认宏、内置头文件位置等。
-
-v是 Clang 自身的开关,输出的是“Clang 怎么调度整个编译流程” - 即使编译失败,也能看到它到底执行了哪些子命令(比如是否调用了
ld、as或clang++自带的 linker) - 适用于排查“为什么找不到头文件”“链接时库没加进去”“实际用了哪个标准库”这类问题
示例:clang++ -v main.cpp 会输出类似:
clang version 17.0.1 Target: x86_64-unknown-linux-gnu Thread model: posix InstalledDir: /usr/bin Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/12 Selected GCC installation: /usr/lib/gcc/x86_64-linux-gnu/12 Candidate multilib: .;@m64 Selected multilib: .;@m64 "/usr/bin/cc1plus" "-E" "-quiet" "-v" ...
用 -verbose 让链接器吐出细节
这个参数只对链接阶段生效,且**必须传给链接器本身**,不是 Clang 前端直接识别的。常见错误是写成 clang++ -verbose main.o —— 这不会生效。
- 正确写法是:
clang++ -Wl,-verbose main.o(-Wl,表示把后面的参数透传给链接器) - 输出内容聚焦在“链接器加载了哪些 archive、解析了哪些符号、搜索了哪些路径、哪些库被忽略”
- 当你遇到 “undefined reference” 却不确定是哪个 .a 没参与链接,或想确认
-L路径是否真被搜索过,才需要它
别把 -Wall 当详细输出用
-Wall 是控制编译器警告的,和“详细输出编译过程”完全无关。它不会告诉你 Clang 调用了什么程序、搜了哪些目录、传了什么隐式参数。
- 混淆后果:误以为开了
-Wall就能看到链接路径,结果调试时卡在找不到库却无从查起 - 真正需要诊断流程时,
-v是第一反应;需要深挖链接行为时,-Wl,-verbose是第二步 - 两者可以共存:
clang++ -v -Wl,-verbose main.o -lm
最容易被忽略的是:-v 输出里包含的 cc1 或 cc1plus 调用行,其实已经暴露了所有预定义宏和头文件搜索路径——很多人翻了几屏日志却没注意最后一段那几行以 "-I" 开头的路径,而那里正是头文件找不到问题的真相所在。


















