仅头文件库的include_directories和interface_include_directories有什么区别

时间:2018-08-28 14:02:21

标签: cmake

我试图理解一个人可以在target_include_directories中指定的范围之间的区别,特别是PRIVATEINTERFACE。该文档说(特定的上下文是 header only库):

  

需要INTERFACE,PUBLIC和PRIVATE关键字来指定   以下参数的范围。私人和公共物品   填充的INCLUDE_DIRECTORIES属性。公共和   INTERFACE项目将填充INTERFACE_INCLUDE_DIRECTORIES   的属性。 (导入的目标仅支持INTERFACE项目。)   以下参数指定包含目录。

因此,基本上使用PRIVATEINTERFACE都会修改INCLUDE_DIRECTORIESINTERFACE_INCLUDE_DIRECTORIES。我确实很难理解两者之间的区别。根据文档中的描述,INCLUDE_DIRECTORIES似乎是编译C ++项目时标志-I的参数。

我完全不理解后者,任何人都可以澄清吗?

显然,在仅使用标头的库中使用INTERFACE更好,为什么?

1 个答案:

答案 0 :(得分:1)

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

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

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

可执行目标

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

库目标

  • 可以设置INCLUDE_DIRECTORIES属性,并为此目录编译文件所需的目录列表
  • 可以为INTERFACE_INCLUDE_DIRECTORIES设置一个目录列表,以编译依赖于该目标的其他目标所需的目录

接口目标

  • 无法设置INCLUDE_DIRECTORIES属性,因为它永远不会被编译
  • 大多数设置INTERFACE_INCLUDE_DIRECTORIES是因为它仅包含头文件,因此依赖的其他目标将需要包括这些头文件

由于这是一个棘手的问题,并且很多人都在问这个问题,所以我会尽快将其变成社区答案,因此通过迭代改进,我们有望找到一种正确解释这一点的方法。