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)时观察到的情况。