在现代 CMake 中将接口库添加为 SYSTEM

Add interface library as SYSTEM in modern CMake

我目前正在将我的 C++ 项目从简单地使用 Makefile 转换为使用 CMake。由于我不熟悉 CMake,我尽量避免学习 "old" CMake 并坚持 "modern CMake" 最佳实践,例如描述 here.

但是,我无法弄清楚如何包含一个简单的 header-only 第三方库 而不会被有关该库的警告所困扰

假设我有一个这样的项目结构:

CMakeLists.txt
src/
  CMakeLists.txt
  main.cpp
third-party-lib/
  foo/
    foo.h

main.cpp 使用 foo: #include <foo.h>

问题是,我使用了一堆警告标志,foo.h 引入了一些我不关心的警告,因为我不是作者,也没什么大不了的。

在经典的 Makefile 中,我会在适当的地方写 -isystem third-party-lib/foo 并完成。

在 CMake 中,我通过 top-level CMakeLists.txt.

中的 include_directories(SYSTEM PRIVATE third-party-lib/foo) 实现了这一点

现在,根据上面的 link,我应该放手 include_directories() 以避免隐藏的依赖关系,我认为这是一个好主意。我宁愿为每个实际需要 foo 的目标指定包含该库并将其视为“不要在这里警告我”。据我了解,方法是:

我将如何实现,即查找命令是什么,以及在哪里指定 SYSTEM 属性?或者关于如何解决这个问题的任何其他建议?

你的朋友是target_include_directories。它的工作方式类似于 include_directories,但基于每个目标。

add_executable(foo foo.c)
target_include_directories(foo SYSTEM
    PRIVATE sys_inc
)

要在现代 CMake 中添加 header-only 库,您可以使用 target_include_directoriesSYSTEM INTERFACE。在处理 src/CMakeLists.txt 文件之前,您可以将其放入 top-level CMake 文件中:

add_library(foo INTERFACE)
target_include_directories(foo SYSTEM INTERFACE 
    ${CMAKE_SOURCE_DIR}/third-party-lib/foo
)