CMake设置C++版本应使用CMAKE_CXX_STANDARD还是CXX_STANDARD?
二者核心差异
1. CMAKE_CXX_STANDARD:全局默认配置变量
这是CMake官方定义的全局作用域变量,设置后会自动作用于当前项目中所有后续创建的C目标(包括可执行文件、静态/动态库等),相当于给整个项目的C标准设了统一默认值。
一般用法是直接在项目根目录的CMakeLists.txt最上方配置:
set(CMAKE_CXX_STANDARD 17) # 可选配置:要求编译器必须支持指定版本,不支持就直接报错终止 set(CMAKE_CXX_STANDARD_REQUIRED ON) # 可选配置:禁用编译器的非标准扩展(比如MSVC的/Za、GCC的-std=c++17而非-std=gnu++17) set(CMAKE_CXX_EXTENSIONS OFF)
2. CXX_STANDARD:单目标属性
不带前缀的CXX_STANDARD是单个C++目标的专属属性,仅作用于指定目标,不会影响其他目标,用来给个别目标单独配置不同于全局默认的C++标准版本。
正确用法是在目标定义之后,通过属性设置命令指定:
add_executable(my_app main.cpp) # 仅给my_app这个可执行文件设置C++20标准,不影响项目里的其他目标 set_target_properties(my_app PROPERTIES CXX_STANDARD 20 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF )
为什么测试时没感觉到差异?
你测试时没发现区别大概率是两个原因:
- 你的编译器默认C版本就是你设置的版本(比如新版本GCC/Clang默认就是C17,MSVC 2022默认是C++14或更高),就算不主动配置也会用对应版本编译
- 你可能直接全局写了
set(CXX_STANDARD 17),但这个写法本身是无效的,CMake不会读取这个全局变量,实际生效的还是你之前配置的CMAKE_CXX_STANDARD或者编译器默认值,所以没感知到变化。
使用建议
- 绝大多数场景直接用
CMAKE_CXX_STANDARD做全局统一配置即可,写法更简单,也能避免项目里不同目标标准不统一的问题 - 只有当项目中个别目标需要用和全局不一样的C++标准时,再用
CXX_STANDARD目标属性单独配置即可
内容的提问来源于stack exchange,提问作者JAYD3V
相关产品推荐
相关产品推荐

