如何使用CMake为项目不同源文件指定不同的C++编译标准
CMake 不同源文件指定不同C++标准配置方案
不要全局设置CMAKE_CXX_STANDARD变量,该全局配置会覆盖所有目标的默认编译标准,按以下步骤拆分目标单独配置即可:
1. 配置库目标强制使用C++03标准+严格校验
给你的函数库目标单独设置编译属性,且属性用PRIVATE限定,不会传递给依赖该库的其他目标:
# 定义库目标,替换为你自己的源文件路径 add_library(my_cpp03_lib STATIC src/lib_utils.cpp src/lib_interface.cpp include/my_lib.h ) # 强制指定C++03标准,禁用编译器扩展 target_compile_features(my_cpp03_lib PRIVATE cxx_std_03) set_target_properties(my_cpp03_lib PROPERTIES CXX_STANDARD_REQUIRED ON # 不允许降级使用更低标准 CXX_EXTENSIONS OFF # 禁用GNU等编译器的非标准扩展 ) # 新增编译选项,只要代码用到C++11及以上特性直接报错 if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") target_compile_options(my_cpp03_lib PRIVATE -Werror=c++11-extensions) elseif(MSVC) target_compile_options(my_cpp03_lib PRIVATE /std:c++03 /WX) endif()
2. 配置单元测试目标使用C++11标准
测试目标单独设置C++11标准,直接链接上面的库即可,两个目标的编译标准完全隔离互不影响:
# 定义单元测试目标,替换为你自己的测试用例路径 add_executable(unit_test test/test_case1.cpp test/test_case2.cpp ) # 强制指定C++11标准适配GTest target_compile_features(unit_test PRIVATE cxx_std_11) set_target_properties(unit_test PROPERTIES CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF ) # 链接库和GTest target_link_libraries(unit_test PRIVATE my_cpp03_lib gtest gtest_main )
3. 额外校验头文件兼容性(可选)
如果需要确保库的公开头文件也完全符合C++03标准,可新增一个校验目标:
# 新增校验目标,header_check.cpp内按顺序引入所有库的公开头文件即可 add_executable(check_lib_header_compat check/header_check.cpp) target_link_libraries(check_lib_header_compat PRIVATE my_cpp03_lib) target_compile_features(check_lib_header_compat PRIVATE cxx_std_03) set_target_properties(check_lib_header_compat PROPERTIES CXX_STANDARD_REQUIRED ON)
编译该目标即可检查头文件是否存在C++11特性。
内容的提问来源于stack exchange,提问作者user2302957
相关产品推荐
相关产品推荐

