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

时间:2018-03-13 17:29:50

标签: 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仅在<{1}}上直接
  • library_bar的{​​{1}}包含app

因此,应用依赖于来自main.cpp间接及其头文件。

我想为我的应用程序的这三个部分编写三个CMakeLists.txt文件。在#include <lib_bar/bar.h>的CMakeLists.txt中,我想仅指定library_foo的依赖关系,即app CMakeLists.txt中指定的library_bar的库和标头依赖关系必须转移到libarary_foo。我怎样才能做到这一点?我想使用library_bar解决方案。

1 个答案:

答案 0 :(得分:1)

命令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)