CMake中CMAKE_CXX_STANDARD要求无法满足时如何干净报错退出
解决方案
你只需要配合CMAKE_CXX_STANDARD开启强制检查开关,CMake就会在配置阶段直接校验编译器的C++标准支持能力,不满足要求时直接抛出明确的错误终止,不会等到编译阶段才输出晦涩的编译报错。
全局配置写法
如果你要给整个项目统一指定C++标准,直接在顶层CMakeLists里写下面三行即可:
# 指定要求的C++标准版本 set(CMAKE_CXX_STANDARD 17) # 开启强制校验:编译器不支持对应标准时直接在配置阶段报错 set(CMAKE_CXX_STANDARD_REQUIRED ON) # 可选:关闭编译器厂商自定义扩展,强制使用纯ISO C++标准 set(CMAKE_CXX_EXTENSIONS OFF)
单目标配置写法
如果你只想给特定编译目标(比如某个可执行文件、静态库)指定C++标准要求,可以用更精准的target级配置,不需要修改全局变量:
add_executable(your_app main.cpp) # 给指定目标添加C++17标准要求,CMake自动完成支持性检查 target_compile_features(your_app PRIVATE cxx_std_17)
配置说明
CMAKE_CXX_STANDARD_REQUIRED默认值为OFF,这也是旧编译器不会提前报错的核心原因:默认模式下CMake只会尝试给编译器传递对应标准的编译参数,不会提前校验支持性,参数不被编译器识别时就会留到编译阶段抛出难以定位的错误。设为ON后配置阶段就会完成校验,错误提示会明确说明当前编译器不支持指定的C++版本,直接终止配置流程。CMAKE_CXX_EXTENSIONS默认值为ON,会自动使用带厂商扩展的标准参数(比如GCC下会用-std=gnu++17而非-std=c++17),如果你的项目需要跨编译器兼容,建议设为OFF避免误用非标准特性。
上述特性从CMake 3.1版本开始就已支持,覆盖目前绝大多数生产环境的CMake使用场景。
内容的提问来源于stack exchange,提问作者CraigDavid
相关产品推荐
相关产品推荐

