include_directories 和 interface_include_directories 与仅标头库之间有什么区别

use*_*759 5 cmake

target_include_directories我试图理解可以在 中具体指定的范围PRIVATEINTERFACE. 文档说(特定上下文是仅标头库):

需要 INTERFACE、PUBLIC 和 PRIVATE 关键字来指定以下参数的范围。PRIVATE 和 PUBLIC 项将填充 的 INCLUDE_DIRECTORIES 属性。PUBLIC 和 INTERFACE 项将填充 的 INTERFACE_INCLUDE_DIRECTORIES 属性。(IMPORTED 目标仅支持 INTERFACE 项。)以下参数指定包含目录。

所以基本上使用PRIVATEorINTERFACE修改INCLUDE_DIRECTORIESor INTERFACE_INCLUDE_DIRECTORIES。我确实很难理解他们两者之间的区别。从文档中的描述来看,似乎是编译 C++ 项目时INCLUDE_DIRECTORIES标志的参数。-I

后者我完全不明白,有人可以澄清吗?

显然,INTERFACE当使用仅标头库时,使用更好,为什么呢?

Ant*_*ane 6

接口目标仅适用于标头库。声明此类目标不会在编译时生成任何内容(CMake 不会生成规则来为这些目标生成对象、可执行文件或库)。

因此,CMake 需要区分用于编译生成对象的目标的标头。

我记得,这两个属性的主要用途如下:(请注意,我并不是 100% 确定所有事情)。

可执行目标

  • 可以使用INCLUDE_DIRECTORIES为此目标编译文件所需的目录列表设置属性
  • 无法INTERFACE_INCLUDE_DIRECTORIES设置,因为其他目标不能依赖于可执行目标(我不确定

库目标

  • 可以使用INCLUDE_DIRECTORIES为此目标编译文件所需的目录列表设置属性
  • 可以设置INTERFACE_INCLUDE_DIRECTORIES包含编译依赖于此目标的其他目标所需的目录列表

接口目标

  • 无法INCLUDE_DIRECTORIES设置属性,因为它永远不会被编译
  • 最有可能具有该INTERFACE_INCLUDE_DIRECTORIES集,因为它仅包含头文件,因此依赖的其他目标将需要包含这些头文件

由于这是一个很难的问题,而且很多人都在问这个问题,我会尽快将这个答案转化为社区答案,因此通过迭代细化,我们希望找到一种方法来正确解释这一点。