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

Posted

技术标签:

【中文标题】从 CMake 中使用的库继承包含目录【英文标题】:Inherit include directories from used library in CMake 【发布时间】:2018-03-13 17:29:49 【问题描述】:

如果我有一个带有公共头文件的库,它被另一个库的公共头文件使用,我如何将前一个库的公共头目录暴露给第三个应用程序,该应用程序只依赖于后一个库没有明确将前一个库的头文件路径添加到应用程序的 target_include_directories 部分

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

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

library_foo 有一个目录,其中包含其公共头文件 library_bar 也有一个包含公共头文件的目录。其中一个公共头文件 (lib_bar/bar.h) 包含一个 #include <lib_foo/foo.h> 条目,即公共头文件引用了在 library_foo 中定义的公共头文件。 library_bar 的实现依赖于 library_fooapp直接依赖于 library_barappmain.cpp 包含一个 #include <lib_bar/bar.h>

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

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

【问题讨论】:

【参考方案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)

【讨论】:

这正是我也尝试过的,但不知何故应用程序看不到 foo 头文件。我会仔细检查并在这里发送回复。 如果您还需要从 target_link_libraries 引入的接口库中继承目录怎么办? 命令 target_include_directories 也适用于 INTERFACE 库,如果你问的话。

以上是关于从 CMake 中使用的库继承包含目录的主要内容,如果未能解决你的问题,请参考以下文章

CMAKE使用手记

怎么在cmake的配置文件里加入

从尚未导入的类继承?

CMake 包含路径 - 依赖于外部库的库

如何在 CMake 项目中包含外部库

有没有办法从 CMake 中提取渲染的预设信息?