【问题标题】:What is the difference between include_directories and interface_include_directories with headers only libraryinclude_directories 和 interface_include_directories 与仅标头库有什么区别
【发布时间】:2018-08-28 14:02:21
【问题描述】:

我试图了解可以在target_include_directories 中指定的范围之间的区别,特别是PRIVATEINTERFACE。文档说(具体的上下文是header only library):

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

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

后者我完全不明白,谁能解释一下?

同样显然使用 INTERFACE 在仅使用标头库时会更好,这是为什么呢?

【问题讨论】:

    标签: cmake


    【解决方案1】:

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

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

    我记得,这 2 个属性的主要用途如下:(请注意,我不是 100% 确定一切)。

    可执行目标

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

    库目标

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

    接口目标

    • 不能设置INCLUDE_DIRECTORIES 属性,因为它永远不会被编译
    • 很可能设置了INTERFACE_INCLUDE_DIRECTORIES,因为它只包含头文件,所以其他依赖的目标需要包含这些头文件

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

    【讨论】:

    • 我觉得有点奇怪,在 CMake 文档中也没有任何解释,至少不是正确的。
    • 但据我了解,这取决于我们要建立什么样的目标。
    • 是和不是。您可能希望声明一个可被另一个目标用作依赖项的库,而不声明在编译该依赖目标时应添加的任何包含目录。 PUBLICPRIVATEINTERFACEtarget_include_directory 的修饰符将仅确定包含目录的使用方式(由当前目标和取决于它的其他目标)
    • 但我同意,CMake 文档绝对是一种痛苦。这是一个很棒的工具,但我看到很多人讨厌它,主要是因为了解它的内部行为通常是一场噩梦
    • @Antwane 答案并不完全正确。对于库目标,INTERFACE_INCLUDE_DIRECTORIES 中的目录也用于构建此目标。至少这是我在安装 CMake (3.7.2) 时观察到的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    • 2010-10-29
    • 2015-01-17
    • 1970-01-01
    • 2011-08-13
    • 2016-09-06
    相关资源
    最近更新 更多