2

我目前正在将我的 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 中,我通过include_directories(SYSTEM PRIVATE third-party-lib/foo)顶级CMakeLists.txt.

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

  • foo在顶层找到目标CMakeLists.txt
  • target_link_libraries(main PRIVATE foo)左右src/CMakeLists.txt

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

4

2 回答 2

2

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

add_library(foo INTERFACE)
target_include_directories(foo SYSTEM INTERFACE 
    ${CMAKE_SOURCE_DIR}/third-party-lib/foo
)
于 2020-05-14T12:45:51.187 回答
0

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

add_executable(foo foo.c)
target_include_directories(foo SYSTEM
    PRIVATE sys_inc
)
于 2020-05-14T12:35:02.777 回答