Cmake include_目录和interface_include_目录之间的区别是什么

Cmake include_目录和interface_include_目录之间的区别是什么,cmake,Cmake,我试图理解在target\u include\u目录中可以指定的范围之间的区别,特别是私有和接口。文档说明(特定上下文为仅标题库): 需要使用接口、公共和私有关键字来指定 以下参数的范围。私人和公共物品将 填充的INCLUDE_DIRECTORIES属性。公共和 接口项将填充接口包含目录 财产。(导入的目标仅支持接口项。) 以下参数指定包含目录 因此,基本上使用PRIVATE或INTERFACE修改INCLUDE\u目录或INTERFACE\u INCLUDE\u目录。我很难理解他们之间的区别。

我试图理解在
target\u include\u目录
中可以指定的范围之间的区别,特别是
私有
接口
。文档说明(特定上下文为仅标题库):

需要使用接口、公共和私有关键字来指定 以下参数的范围。私人和公共物品将 填充的INCLUDE_DIRECTORIES属性。公共和 接口项将填充接口包含目录 财产。(导入的目标仅支持接口项。) 以下参数指定包含目录

因此,基本上使用
PRIVATE
INTERFACE
修改
INCLUDE\u目录
INTERFACE\u INCLUDE\u目录
。我很难理解他们之间的区别。从DOC代码中的描述来看,包含C++目录的< >代码>似乎是编译C++项目时标志<代码> -i/代码>的参数。 我完全不理解后者,有人能澄清一下吗


显然,当使用仅标题库时,使用
接口
更好,这是为什么?

接口目标是仅标题库。声明这样的目标不会在编译时生成任何内容(CMake不会生成规则来为这些目标生成对象、可执行文件或库)

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

正如我所记得的,这两个属性的主要用途如下:(请注意,我不是百分之百确定的一切)

可执行目标

  • 可以将
    INCLUDE_DIRECTORIES
    属性与为此目标编译文件所需的目录列表一起设置
  • 无法设置
    INTERFACE\u INCLUDE\u目录
    ,因为其他目标不能依赖于可执行目标(对此我不确定)
库目标

  • 可以将
    INCLUDE_DIRECTORIES
    属性与为此目标编译文件所需的目录列表一起设置
  • 可以使用编译依赖于此目标的其他目标所需的目录列表设置
    接口\u INCLUDE\u DIRECTORIES
接口目标

  • 无法设置
    INCLUDE\u目录
    属性,因为它永远不会被编译
  • 最有可能设置了
    接口\u INCLUDE\u目录
    ,因为它只包含头文件,所以依赖的其他目标将需要包含这些头文件

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

我觉得有点奇怪,CMake文档中也没有解释,至少不是一个合适的库。但据我所知,这是一个我们要构建的目标类型的问题。是和否。您可能希望声明一个库,该库可以被另一个目标用作依赖项,而不声明编译依赖目标时应添加的任何包含目录
PUBLIC
PRIVATE
INTERFACE
target\u include\u目录的修饰符
只会决定如何使用include目录(由当前的target和其他依赖它的目标使用),但我同意,CMake文档肯定是一个难题。这是一个很好的工具,但我看到很多人都讨厌它,主要是因为了解它的内部行为往往是一件非常困难的事情nightmare@Antwane答案并不完全正确。对于库目标,
接口中的目录INCLUDE\u目录
也用于构建此目标。至少这是我在安装CMake(3.7.2)时观察到的情况。