已启用异常仍触发clang-tidy禁用异常错误的技术问询
问题描述
在CMake项目中通过以下配置启用clang-tidy集成:
set(CMAKE_CXX_CLANG_TIDY clang-tidy; -header-filter=.; --config-file=${MY_CLANG_TIDY_CONFIG_PATH}; )
.clang-tidy配置文件仅包含命名规范检查规则。执行构建命令:
cmake --build --preset=ninja-wd --target=Eureka.Core
时,clang抛出错误:
error: cannot use 'throw' with exceptions disabled [clang-diagnostic-error] throw std::system_error(ec, "system error");
已知cl.exe已传入/EHsc参数启用异常,且禁用clang-tidy集成后项目可正常构建。
问题原因与解决办法
- 核心原因:clang-tidy在分析代码时未正确继承cl.exe的
/EHsc编译参数,导致它误判当前环境未启用异常支持,触发诊断错误。 - 解决办法:
- 明确在CMake中传递
/EHsc参数,确保clang-tidy能获取到:- 全局生效:
add_compile_options(/EHsc) - 仅针对目标生效:
target_compile_options(Eureka.Core PRIVATE /EHsc)
- 全局生效:
- 若全局/目标配置无效,直接在clang-tidy启动参数中添加
--extra-arg=/EHsc,强制指定启用异常:set(CMAKE_CXX_CLANG_TIDY clang-tidy; -header-filter=.; --config-file=${MY_CLANG_TIDY_CONFIG_PATH}; --extra-arg=/EHsc; ) - 可通过添加
--dump-config参数到clang-tidy配置中,查看实际生效的编译参数,确认/EHsc是否被正确加载。
- 明确在CMake中传递
内容的提问来源于stack exchange,提问作者Elad Maimoni
相关产品推荐
相关产品推荐

