CMake中如何屏蔽通过FetchContent引入的外部库的编译器警告
解决方案
1. 适配低版本CMake的SYSTEM目录标记
target_link_libraries的SYSTEM关键字对导入目标的支持是CMake 3.25版本新增特性,如果你使用的CMake版本低于该值,该配置不会生效。可以在拉取cpr完成后手动标记其头目录为系统目录,自动屏蔽头文件相关警告:
include(FetchContent) FetchContent_Declare(cpr GIT_REPOSITORY https://github.com/whoshuu/cpr.git GIT_TAG c8d33915dbd88ad6c92b258869b03aba06587ff9) # 对应1.5.0版本提交 FetchContent_MakeAvailable(cpr) # 新增配置 set_target_properties(cpr::cpr PROPERTIES INTERFACE_SYSTEM_INCLUDE_DIRECTORIES $<TARGET_PROPERTY:cpr::cpr,INTERFACE_INCLUDE_DIRECTORIES> )
2. 关闭cpr内置的警告视为错误配置
cpr默认构建开启-Werror将所有警告视为错误,可在拉取前通过缓存变量关闭该特性,无需修改cpr源码:
include(FetchContent) # 先配置cpr构建选项 set(CPR_ENABLE_WERROR OFF CACHE BOOL "" FORCE) FetchContent_Declare(cpr GIT_REPOSITORY https://github.com/whoshuu/cpr.git GIT_TAG c8d33915dbd88ad6c92b258869b03aba06587ff9) FetchContent_MakeAvailable(cpr)
3. 手动追加警告屏蔽参数
如果仍有警告残留,可直接给cpr目标追加g++警告屏蔽选项,根据实际报错的警告类型调整参数即可:
target_compile_options(cpr::cpr INTERFACE -Wno-unused-parameter -Wno-deprecated-declarations -Wno-implicit-fallthrough )
完成上述任意一种适配后,链接逻辑保持原有写法即可:
target_link_libraries(my_target PRIVATE cpr::cpr PUBLIC other_libraries)
内容的提问来源于stack exchange,提问作者nbadami
相关产品推荐
相关产品推荐

