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

如何阻止CMake中添加的子目录继承全局C++标准设置?

解决CMake全局C++17设置不传递给指定子目录的方法

方案一:临时重置变量后恢复

在引入第三方库的add_subdirectory前后,临时修改C++标准相关变量,避免全局设置传递给子目录:

# 保存当前全局C++标准设置
set(ORIGINAL_CXX_STANDARD ${CMAKE_CXX_STANDARD})
set(ORIGINAL_CXX_STANDARD_REQUIRED ${CMAKE_CXX_STANDARD_REQUIRED})
set(ORIGINAL_CXX_EXTENSIONS ${CMAKE_CXX_EXTENSIONS})

# 重置为第三方库兼容的标准(比如C++11,或留空让其自行决定)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED OFF)
set(CMAKE_CXX_EXTENSIONS OFF)

# 引入第三方库子目录
add_subdirectory(thirdparty/xxx)

# 恢复原全局设置
set(CMAKE_CXX_STANDARD ${ORIGINAL_CXX_STANDARD})
set(CMAKE_CXX_STANDARD_REQUIRED ${ORIGINAL_CXX_STANDARD_REQUIRED})
set(CMAKE_CXX_EXTENSIONS ${ORIGINAL_CXX_EXTENSIONS})

方案二:仅为自身项目目标设置C++17

放弃全局设置,改为给你自己的每个目标单独指定C++17标准,这样第三方子目录不会继承:

# 针对单个目标设置
add_executable(your_target src/main.cpp)
set_target_properties(your_target PROPERTIES
    CXX_STANDARD 17
    CXX_STANDARD_REQUIRED ON
    CXX_EXTENSIONS OFF
)

# 或者用target_compile_features更直观
target_compile_features(your_target PRIVATE cxx_std_17)

# 之后正常引入第三方库
add_subdirectory(thirdparty/xxx)

方案三:修改第三方库的CMakeLists.txt(可选)

如果允许修改第三方代码,直接在thirdparty/xxx/CMakeLists.txt开头添加它兼容的C++标准设置,覆盖全局值:

# 在第三方库的CMakeLists.txt顶部添加
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

这种方式无需改动主项目的全局设置,但后续更新第三方库时需要注意保留该修改。

内容的提问来源于stack exchange,提问作者konchy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 00:43:13