如何阻止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
相关产品推荐
相关产品推荐

