必须确保项目根目录存在有效的compile_commands.json,CMake项目启用CMAKE_EXPORT_COMPILE_COMMANDS=ON生成,非CMake项目用bear或compiledb生成;VSCode中需验证clangd状态栏显示“ready”,并禁用C_Cpp.intelliSenseEngine避免冲突。

Clang 和 clang-tidy 不是“一起配置”的关系,而是 clang-tidy 依赖 Clang 的编译上下文才能正确工作;没配好 Clang(准确说是编译数据库),clang-tidy 就会报错、漏检、甚至完全不触发。
clang-tidy 报 error: unable to find compilation database 怎么办
这是最常见也最致命的问题——clang-tidy 根本不知道你的代码该用什么头文件路径、宏定义、C++标准版本。它不是靠猜,而是靠 compile_commands.json 文件提供完整编译命令。
- 必须确保项目根目录下存在有效的
compile_commands.json,且内容不是空数组或结构错误 - CMake 项目:启用
set(CMAKE_EXPORT_COMPILE_COMMANDS ON),构建后自动生成;VSCode 中用cmake-tools插件时,勾选Export compile commands - 非 CMake 项目(如 Makefile):用
bear -- make或compiledb make生成,注意确认生成的 JSON 里每个file字段是相对路径或能被 clang-tidy 正确解析的绝对路径 - VSCode 中检查是否生效:打开任意
.cpp文件,看右下角状态栏是否显示clangd: ready;如果显示clangd: indexing...卡住,大概率是compile_commands.json路径不对或内容损坏
VSCode 里 clangd 和 clang-tidy 插件要不要共存
要,但角色严格分离:clangd 负责补全、跳转、重命名等语言服务;clang-tidy 插件(如 ms-vscode.cpptools 内置支持或独立插件)只负责读取 .clang-tidy 并调用 clang-tidy 二进制执行检查。
- 禁用
C_Cpp.intelliSenseEngine(设为"disabled"),否则cpptools会和clangd冲突,导致跳转失败或诊断重复 - 不要在
settings.json里同时配"clangd.path"和"clang-tidy.executable"指向不同 LLVM 版本——它们应来自同一套工具链,否则可能因 AST 解析不兼容导致误报 - Windows 用户尤其注意:如果用 MSVC 工具链编译,但
clang-tidy调用的是 MinGW 版本,会因头文件路径差异直接崩溃;建议统一用clang-cl+clang-tidy组合
.clang-tidy 里怎么写 Checks 才不和 Clang 编译参数冲突
clang-tidy 的 Checks 是静态分析规则,和 Clang 的 -std=、-I 等编译参数无关,但它会继承 compile_commands.json 里的所有编译选项——包括你加的 -DFOO=1 或 -fno-exceptions。
- 避免在
.clang-tidy的Checks字段里启用需要运行时信息的检查器(如android.*、darwin.*),这些在纯编译期分析中不可用,只会报checker not found - 禁用某条规则时用前导
-,例如Checks: "-cppcoreguidelines-owning-memory, modernize-use-auto";别写成cppcoreguidelines-owning-memory: false,那不是合法语法 - 如果 clang-tidy 报
unknown type name 'size_t',不是规则问题,是compile_commands.json里缺失stdlib路径——检查生成该文件的构建系统是否启用了-stdlib=libc++或对应 GNU libstdc++ 路径
真正难调的从来不是规则列表,而是让 clang-tidy 看到和 Clang 编译器一模一样的头文件视图和宏定义环境。任何脱离 compile_commands.json 谈 clang-tidy 配置,都是在调试幻觉。

















