我试图理解在target_include_directories中可以指定的作用域之间的区别,特别是PRIVATE和INTERFACE。文档说明(特定的上下文仅为标头库):
需要接口、公共关键字和私有关键字来指定下列参数的范围。私有和公共项将填充INCLUDE_DIRECTORIES属性。的INTERFACE_INCLUDE_DIRECTORIES属性中的公共项和接口项。(导入的目标只支持接口项。)下列参数指定包含目录。
因此,使用PRIVATE或INTERFACE基本上可以修改INCLUDE_DIRECTORIES或INTERFACE_INCLUDE_DIRECTORIES。我确实很难理解他们之间的区别。从文档中的描述来看,INCLUDE_DIRECTORIES似乎是编译C++项目时标志C++的参数。
我完全不明白后者的意思,有人能澄清吗?
而且,如果只使用标头库,显然使用INTERFACE更好,为什么呢?
发布于 2018-08-28 14:21:35
接口目标仅用于标头库。声明这样的目标不会在编译时产生任何内容(CMake不会为这些目标生成生成对象、可执行文件或库的规则)。
因此,CMake需要区分将用于编译生成对象的目标的标头。
正如我所记得的,这两个属性的主要用途如下:(请注意,我不是100%肯定所有的东西)。
可执行目标
INCLUDE_DIRECTORIES属性。INTERFACE_INCLUDE_DIRECTORIES,因为其他目标不能依赖可执行目标(我不确定)A库目标
INCLUDE_DIRECTORIES属性。INTERFACE_INCLUDE_DIRECTORIES设置为编译依赖于此目标的其他目标所需的目录列表。接口目标
INCLUDE_DIRECTORIES属性,因为它永远不会被编译INTERFACE_INCLUDE_DIRECTORIES,因为它只包含头文件,因此其他依赖的目标需要包含这些头文件。由于这是一个困难的问题,而且很多人都在问这个问题,我将尽快将这个答案转化为社区的答案,因此通过迭代精化,我们有望找到一种正确解释这一点的方法。
https://stackoverflow.com/questions/52059777
复制相似问题