我有一个外部库,正在我的包中使用
- package/
- include/
- src/
- external_library/
- CMakeLists.txt
- CMakeLists.txt
目前在
package/CMakeLists.txt
我通过 添加外部库
add_subdirectory(external_library library_name)
add_executable(my_executable src/main.cpp)
target_link_libraries(my_executable library_name)
并且在
external_library/CMakeLists.txt
内有类似的东西
add_library(library_name <files>)
我想禁用
external_library/
中文件的警告,这样我就可以更改 package/CMakeLists.txt
中的错误设置,而不会看到来自外部库的冲突。如果可能的话,我想避免更改 external_library/
中的任何内容。这怎么办?
您可以为每个外部目标手动添加
-w
标志,这将禁用 GCC、Clang 和 MSVC 上的所有警告(或编译器的任何标志,用于您想要禁用的特定警告),并依赖事实上,后来的标志将覆盖这些编译器以前的标志。前任。要禁用目标编译的所有警告,您可以使用 target_compile_options(foo PRIVATE -w)
。
如果外部项目中有很多目标,并且您想以类似的方式抑制所有目标的警告,假设您不想修改外部项目的 CMakeLists.txt 文件,则可以保存 的副本
COMPILE_OPTIONS
目录属性,修改它,添加子目录,然后恢复旧值。例如。
# retrieve a copy of the current directory's `COMPILE_OPTIONS`
get_directory_property(old_dir_compile_options COMPILE_OPTIONS)
# modify the actual value of the current directory's `COMPILE_OPTIONS` (copy from above line remains unchanged). subdirectories inherit a copy of their parent's `COMPILE_OPTIONS` at the time the subdirectory is processed.
add_compile_options(-w)
# add you subdirectory (whichever way you do it)
# add_subdirectory(external ...)
# FetchContent_MakeAvailable(...)
# restore the current directory's old `COMPILE_OPTIONS`
set_directory_properties(PROPERTIES COMPILE_OPTIONS "${old_dir_compile_options}")
如果警告位于库的标头中,并且在包含标头时发生,请尝试将目标标记为
SYSTEM
(您可以通过使用 cmake_minimum_required(VERSION 3.25)
目标属性使用
SYSTEM
或更高级别来实现) 。在 CMake 3.25 之前的版本中,您可以使用一种解决方法,将 INTERFACE_INCLUDE_DIRECTORIES
目标属性复制/移动到 INTERFACE_SYSTEM_INCLUDE_DIRECTORIES
目标属性(相关帖子)。这样做可能会产生其他后果,但将目标标记为 SYSTEM
的副作用之一通常是,当被具有警告标志的东西 #include
时,编译器不会为它们发出警告。
如果您有
cmake_minimum_required(VERSION 3.25)
或更高版本,并且外部库仅包含标头,您可以考虑不同的解决方案。 add_subdirectory
和 FetchContent_Declare
带有您可以使用的 SYSTEM
选项,这会导致添加到相应子目录及其下的所有目标将其包含目录全部视为 SYSTEM
(这将导致在 CMake 中为编译器生成相应的包含标志)。
使用
set_source_files_properties
设置 COMPILE_FLAGS
以忽略外部库的所有源文件的警告 (-w
)。
# package/CMakeLists.txt
# Get the list of all sources of external_lib
file(GLOB EXTERNAL_LIBRARY_SOURCES external_library/*.cpp)
set_source_files_properties(
${EXTERNAL_LIBRARY_SOURCES}
PROPERTIES COMPILE_FLAGS "-w"
)
add_subdirectory(external_library library_name)
add_executable(my_executable src/main.cpp)
target_link_libraries(my_executable library_name)