如何抑制子目录中外部库的CMake编译警告?
如何在不修改外部库代码的情况下禁用其编译警告
有两种可靠的方法可以实现你的需求,无需修改外部库的任何文件:
方法一:临时修改全局编译选项控制外部库警告
在添加外部库子目录前后,保存并恢复当前的警告编译设置,确保外部库编译时禁用所有警告:
# 保存当前的C++编译警告相关选项 set(OLD_CXX_FLAGS "${CMAKE_CXX_FLAGS}") set(OLD_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}") set(OLD_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") # 禁用外部库的所有警告(GCC/Clang用-w,MSVC用/W0) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -w") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -w") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -w") # 添加外部库子目录 add_subdirectory(external_library library_name) # 恢复原来的警告设置,不影响自身代码编译 set(CMAKE_CXX_FLAGS "${OLD_CXX_FLAGS}") set(CMAKE_CXX_FLAGS_DEBUG "${OLD_CXX_FLAGS_DEBUG}") set(CMAKE_CXX_FLAGS_RELEASE "${OLD_CXX_FLAGS_RELEASE}") # 编译自身可执行文件 add_executable(my_executable src/main.cpp) target_link_libraries(my_executable library_name)
方法二:直接为外部库目标设置编译选项
利用CMake的目标属性,直接给外部库的目标添加禁用警告的编译选项,这种方式更精准,不会干扰全局设置:
add_subdirectory(external_library library_name) # 根据编译器类型设置对应的禁用警告选项,保证跨平台兼容性 if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") target_compile_options(library_name PRIVATE -w) elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") target_compile_options(library_name PRIVATE /W0) endif() add_executable(my_executable src/main.cpp) target_link_libraries(my_executable library_name)
关键说明
PRIVATE关键字确保禁用警告的选项仅作用于外部库自身的编译,不会传递给链接它的my_executable目标,避免影响你自己代码的警告设置。- 两种方法都完全不需要修改
external_library/目录下的任何文件,符合你的需求。
内容的提问来源于stack exchange,提问作者Morten Nissov
相关产品推荐
相关产品推荐

