从 CMake 中使用的库中继承包含目录

  • 本文关键字:继承 包含目 CMake cmake
  • 更新时间 :
  • 英文 :


如果我有一个库,其中包含由另一个库的公共头文件使用的公共头文件,我如何将前一个库的公共头目录公开给仅依赖于后一个库的第三个应用程序,而无需将前一个库的头文件的路径显式添加到应用程序的target_include_directories部分

我知道这有点令人困惑,这里有一个简单的例子:

我在同一个 cmake 项目中有两个共享库和一个应用程序:

  • library_foo有一个包含其公共头文件的目录
  • library_bar还有一个包含其公共头文件的目录。其中一个公共头文件(lib_bar/bar.h)包含一个#include <lib_foo/foo.h>条目,即公共头文件具有对library_foo中定义的公共头文件的引用。
  • library_bar实现取决于library_foo
  • app仅直接取决于library_bar
  • appmain.cpp包含一个#include <lib_bar/bar.h>

因此,应用程序也间接依赖于library_foo及其头文件。

我想为我的应用程序的这三个部分编写三个 CMakeLists.txt 文件。在 CMakeList 中.txtapp我只想指定对library_bar的依赖关系,即library_barCMakeList 中指定的libarary_foo的库和标头依赖项.txt必须转移到app中。我该怎么做?我想使用target_*解决方案。

命令 target_include_directories 完全用于继承目的:

add_library(library_foo SHARED ...)
# Include directories are made an interface of 'foo'.
target_include_directories(library_foo PUBLIC <dir-with-lib_foo/foo.h>)

add_library(library_bar SHARED ...)
target_include_directories(library_bar PUBLIC <dir-with-lib_bar/bar.h>)
# Linking with 'foo' propagates include directories
# and makes these directories an interface of 'bar' too.
target_link_libraries(library_bar library_foo)

add_executable(app ...)
# Application will use include directories both from 'bar' and 'foo'.
target_link_libraries(app library_bar)

最新更新