Windows(Qt Creator+MinGW)环境clang-tidy无法找到标准头文件
解决方案:修复Windows MinGW环境下clang-tidy找不到标准库的问题
我来帮你搞定这个clang-tidy找不到MinGW标准库的问题——在Windows+Qt Creator+MinGW的环境下,这个问题通常是因为clang-tidy没正确获取到MinGW的系统头文件路径,再加上子模块的CMake上下文和主项目有差异,导致路径传递容易遗漏。下面是经过验证的有效解决方法:
方法1:正确使用compile_commands.json(推荐)
你之前的-p参数写法有误,clang-tidy要求-p和路径之间不能有空格,而且要确保compile_commands.json生成在正确的构建目录下。修改你的CMake配置如下:
option(RUN_CLANG_TIDY "Run clang-tidy with the compiler." ON) if(RUN_CLANG_TIDY) if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) message(FATAL_ERROR "CMake_RUN_CLANG_TIDY requires an out-of-source build!") endif() # 开启compile_commands.json生成 set(CMAKE_EXPORT_COMPILE_COMMANDS ON) file(GLOB CLION_PATH "C:/Program Files/JetBrains/CLion*/bin/clang/win" ) find_program(CLANG_TIDY_EXE NAMES clang-tidy HINTS "C:/Program Files/LLVM/bin" "C:/Qt/Tools/QtCreator/bin/clang/bin" "${CLION_PATH}" ) if(NOT CLANG_TIDY_EXE) message(WARNING "CMake_RUN_CLANG_TIDY is ON but clang-tidy is not found!") set(CMAKE_CXX_CLANG_TIDY "" CACHE STRING "" FORCE) else() # 注意-p和路径之间没有空格,用绝对路径指向构建目录 set(DO_CLANG_TIDY "${CLANG_TIDY_EXE}" "-p=${CMAKE_BINARY_DIR}") message("-- Clang-tidy found: ${DO_CLANG_TIDY}") endif() endif() # ... 你的其他CMake代码 ... add_library(...) if(DO_CLANG_TIDY) set_target_properties(${PROJECT_NAME} PROPERTIES CXX_CLANG_TIDY "${DO_CLANG_TIDY}" ) endif() target_include_directories(...)
这样clang-tidy会直接读取构建目录下的compile_commands.json,里面包含了所有编译时的头文件路径和参数,能自动识别MinGW的标准库,完全不用手动指定路径。
方法2:手动传递完整的MinGW系统头文件路径
如果方法1不生效,你可以手动把MinGW的所有标准库路径通过-extra-arg=-isystem传递给clang-tidy。注意要包含MinGW的完整系统头文件路径,不只是include/c++目录:
# ... 前面的clang-tidy查找代码不变 ... else() # 替换成你的MinGW实际安装路径 set(MINGW_INCLUDE_PATH "C:/Qt/Tools/mingw730_64") set(DO_CLANG_TIDY "${CLANG_TIDY_EXE}" "-extra-arg=-isystem${MINGW_INCLUDE_PATH}/lib/gcc/x86_64-w64-mingw32/7.3.0/include/c++" "-extra-arg=-isystem${MINGW_INCLUDE_PATH}/lib/gcc/x86_64-w64-mingw32/7.3.0/include/c++/x86_64-w64-mingw32" "-extra-arg=-isystem${MINGW_INCLUDE_PATH}/lib/gcc/x86_64-w64-mingw32/7.3.0/include/c++/backward" "-extra-arg=-isystem${MINGW_INCLUDE_PATH}/x86_64-w64-mingw32/include" "-extra-arg=-isystem${MINGW_INCLUDE_PATH}/include" ) message("-- Clang-tidy found: ${DO_CLANG_TIDY}") endif()
这里要确保每个-isystem路径都是单独的-extra-arg参数,不能合并成一个,clang-tidy会逐个解析这些路径。
方法3:确保clang-tidy与MinGW版本兼容
如果上面两种方法都不行,可能是clang-tidy版本和MinGW不匹配:
- 优先使用Qt Creator自带的clang-tidy(路径在
C:/Qt/Tools/QtCreator/bin/clang/bin),它通常已经适配了Qt配套的MinGW版本 - 避免使用CLion或LLVM独立安装的clang-tidy,除非你确认它支持MinGW的目标平台(x86_64-w64-mingw32)
额外注意事项
- 子模块的CMakeLists.txt要确保继承主项目的clang-tidy配置,或者在子模块中单独配置上述路径
- 不要设置
-stdlib=libc++,因为MinGW使用的是GNU的libstdc++,不是LLVM的libc++,这个参数会导致clang-tidy找错标准库
内容的提问来源于stack exchange,提问作者Programmierkartoffel
相关产品推荐
相关产品推荐

