如何通过target_compile_options为CMake主项目与子项目设置不同警告级别
解决主项目启用-Werror/-Wall但子项目禁用-Werror的CMake配置方法
方法1:临时修改全局编译选项后恢复
适合子项目继承全局CMAKE_CXX_FLAGS的场景,在引入子项目前移除全局的-Werror,引入后恢复,主项目通过target_compile_options单独设置严格编译规则:
project(MyProject) # 保存当前全局C++编译选项 set(ORIGINAL_CXX_FLAGS "${CMAKE_CXX_FLAGS}") # 从全局选项中移除-Werror(若存在) string(REPLACE "-Werror" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") # 引入子项目,此时子项目编译不会带上-Werror add_subdirectory(SomeLibrary) # 恢复原全局编译选项 set(CMAKE_CXX_FLAGS "${ORIGINAL_CXX_FLAGS}") # 主项目单独启用严格编译 add_executable(MyProject ${SRC_FILES}) target_compile_options(MyProject PRIVATE -Werror -Wall) target_link_libraries(MyProject SomeLibrary)
方法2:直接修改子项目目标的编译选项
如果子项目自身通过target_compile_options设置了-Werror,可直接修改子项目的目标属性移除该选项:
project(MyProject) # 引入子项目 add_subdirectory(SomeLibrary) # 获取子项目目标的当前编译选项 get_target_property(SOME_LIB_COMPILE_OPTIONS SomeLibrary COMPILE_OPTIONS) # 从列表中移除-Werror list(REMOVE_ITEM SOME_LIB_COMPILE_OPTIONS "-Werror") # 重新设置编译选项给子项目目标 set_target_properties(SomeLibrary PROPERTIES COMPILE_OPTIONS "${SOME_LIB_COMPILE_OPTIONS}") # 主项目配置 add_executable(MyProject ${SRC_FILES}) target_compile_options(MyProject PRIVATE -Werror -Wall) target_link_libraries(MyProject SomeLibrary)
方法3:通过预注入脚本修改子项目配置
无需直接修改子项目目标,在子项目配置阶段注入自定义逻辑,灵活性更高:
- 在主项目根目录创建
fix_some_library.cmake文件,内容如下:
# 移除当前子项目目标的-Werror选项 get_target_property(CURRENT_OPTIONS ${PROJECT_NAME} COMPILE_OPTIONS) if(CURRENT_OPTIONS) list(REMOVE_ITEM CURRENT_OPTIONS "-Werror") set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_OPTIONS "${CURRENT_OPTIONS}") endif() # 若子项目通过全局选项启用-Werror,也可直接添加抵消选项: # target_compile_options(${PROJECT_NAME} PRIVATE -Wno-error)
- 在主项目的CMakeLists.txt中配置预注入脚本:
project(MyProject) # 指定子项目SomeLibrary在配置前加载自定义脚本 set(CMAKE_PROJECT_SomeLibrary_INCLUDE "${CMAKE_CURRENT_SOURCE_DIR}/fix_some_library.cmake") # 引入子项目 add_subdirectory(SomeLibrary) # 主项目配置 add_executable(MyProject ${SRC_FILES}) target_compile_options(MyProject PRIVATE -Werror -Wall) target_link_libraries(MyProject SomeLibrary)
内容的提问来源于stack exchange,提问作者StkOverflowSellsUrDataToOpenAI
相关产品推荐
相关产品推荐

