【问题标题】:Do I really need to specify install-interface includes dependencies?我真的需要指定 install-interface 包含依赖项吗?
【发布时间】:2020-05-01 17:39:13
【问题描述】:

在我的一个包裹中,我目前有:

include(GNUInstallDirs)
target_include_directories(
    mylib
    PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> # ***
)

还有:

install(
  TARGETS mylib
  EXPORT mylib
  RUNTIME DESTINATION  "${CMAKE_INSTALL_BINDIR}"
  ARCHIVE DESTINATION  "${CMAKE_INSTALL_LIBDIR}"
  LIBRARY DESTINATION  "${CMAKE_INSTALL_LIBDIR}"
  INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" 
)

install(
  EXPORT mylib
  FILE "mylib-config.cmake"
  NAMESPACE mylib::
  DESTINATION "lib/cmake/mylib" )

我注意到在安装的config.cmake 文件中,我看到了包含目录两次

set_target_properties(mylib::mylib PROPERTIES
  # etc. etc.
  INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include;${_IMPORT_PREFIX}/include"
)

因此,作为一个实验,我删除了上面标记为 *** 的行 - 配置文件现在只有包含目录一次

那么,这样做安全吗?也就是说,如果我使用 INCLUDES 参数安装目标,我真的不需要指定 install-interface 包含目录吗?或者 - 我错过了什么?

【问题讨论】:

    标签: cmake include installation include-path


    【解决方案1】:

    文档明确指出 both target_include_directories 命令与非PRIVATE 关键字和install 命令的INCLUDES DESTINATION 子句填充@987654321 @属性。

    由你决定使用哪种方法。

    注意,同一个目标可以安装多次。 target_include_directories 影响所有安装,但包括目的地仅影响特定安装。


    Documentation for INCLUDES DESTINATION 子句:

    此选项指定在由install(EXPORT) 命令导出时将添加到&lt;targets&gt;INTERFACE_INCLUDE_DIRECTORIES 目标属性的目录列表。如果指定了相对路径,则将其视为相对于$&lt;INSTALL_PREFIX&gt;

    Documentationtarget_include_directories

    PUBLICINTERFACE 项目将填充 &lt;target&gt;INTERFACE_INCLUDE_DIRECTORIES 属性。

    【讨论】:

    • 1.但是文档是否保证构建接口目录被“翻译”成安装接口目录,就像他们看起来的那样? 2. 如果一个target可以多次安装到不同的地方,那是不是说明我们应该在install命令中指定包含文件的目的地?
    • 1.没有从 build-interfaceinstall-interface 的转换。在生成的配置文件中,您只能看到 INSTALL_INTERFACECMAKE_INSTALL_INCLUDEDIR 变量包含 include/,并且因为这不是绝对路径,所以它前面带有安装前缀。 2. 多次安装目标是一件非常罕见的事情。我同意选择 INCLUDES DESTINATION 有一定的意义,因为它允许在一个地方描述所有与安装相关的东西。但目前我所知道的 CMake 文档和其他“官方”来源都不喜欢一种方式。
    • 但是当我删除 INSTALL_INTERFACE 行时,即假定只依赖于BUILD_INTERFACE 目录时,我仍然会在-config.cmake 文件中获得包含目录。跨度>
    • 嗯,配置文件可能从其他来源获取包含目录。 CMake 绝对不使用 BUILD_INTERFACE 来安装目标,并且绝对不假设 CMAKE_CURRENT_SOURCE_DIRCMAKE_INSTALL_PREFIX 之间有任何关系。
    • 好的,我刚刚重新检查了。 CMake 似乎完全从目标的 INSTALL_INTERFACE 和 install 命令的 INCLUDE_DIRECTORIES 中获取目录的联合,仅此而已。因此,正如您所建议的那样,没有翻译。
    猜你喜欢
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 2012-04-04
    • 2016-09-13
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多