You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 00:27:35