我有一个在我的包中使用的外部库
- 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
目标属性(相关帖子)。
如果你有
cmake_minimum_required(VERSION 3.25)
或更高版本并且外部库是header-only,你可以考虑不同的解决方案。 add_subdirectory
和 FetchContent_Declare
带有一个可以使用的 SYSTEM
选项,这会导致添加到相应子目录和下的所有目标都将其包含目录全部视为 SYSTEM
(这将导致在 CMake 中为编译器生成相应的包含标志)。这样做还有其他后果,但是将目标标记为 SYSTEM
的副作用之一通常是当 #include
d 被带有警告标志的东西时,编译器不会为它们发出警告。
使用
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)