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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 00:45:02