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

5
如果我有一个库,其中包含公共头文件,被另一个库的公共头文件使用,那么如何将前者库的公共头目录暴露给仅依赖于后者库的第三方应用程序,而不需要显式地将前者库的头文件路径添加到应用程序的target_include_directories部分?
我知道这有点混乱,下面是一个简单的例子:
我在同一个cmake项目中有两个共享库和一个应用程序:
- library_foo有一个包含其公共头文件的目录 - library_bar也有一个包含其公共头文件的目录。其中一个公共头文件(lib_bar/bar.h)包含#include 条目,即公共头文件引用了library_foo中定义的公共头文件。 - library_bar的实现依赖于library_foo。 - 应用程序直接仅依赖于library_bar。 - 应用程序的main.cpp包含#include 。
因此,app间接依赖于library_foo及其头文件。
我想为我的应用程序编写三个CMakeLists.txt文件。在app的CMakeLists.txt中,我只想指定对library_bar的依赖关系,即在library_bar CMakeLists.txt中指定的来自libarary_foo的库和头依赖关系必须传递到app。我该怎么做?我想使用target_*解决方案。
1个回答

4

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

这正是我尝试过的,但不知何故应用程序无法看到foo头文件。我会仔细检查并在此处发送响应。 - Tibor Takács
如果您还需要继承由target_link_libraries引入的接口库中的目录,该怎么办? - David Ledger
如果您询问,命令target_include_directories也适用于INTERFACE库。 - Tsyvarev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接