在现代 CMake 中添加接口库作为系统

Add interface library as SYSTEM in modern CMake

本文关键字:系统 接口 添加 CMake      更新时间:2023-10-16

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

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

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

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中,我通过在顶级CMakeLists.txtinclude_directories(SYSTEM PRIVATE third-party-lib/foo)实现了这一目标。

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

  • 在顶级CMakeLists.txt中查找foo目标
  • target_link_libraries(main PRIVATE foo)左右src/CMakeLists.txt

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

要在现代 CMake 中添加仅标头库,可以将target_include_directoriesSYSTEM INTERFACE一起使用。在处理src/CMakeLists.txt文件之前,可以将其放在顶级 CMake 文件中:

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

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

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