【问题标题】:Install EXPORT requires target from subproject安装 EXPORT 需要来自子项目的目标
【发布时间】:2018-01-28 09:14:11
【问题描述】:

我正在尝试编写一个 cmake 脚本来安装我正在处理的项目。其中一部分是必要的install(EXPORT LIB_EXPORTS ...),其中LIB_EXPORTS 是我在各种install(TARGETS ...) 中一直用于EXPORT 属性的。

我有一个超级构建结构,它使用add_subdirectory 构建我的项目所依赖的一些项目(SDL2、CivetWeb)。

我的问题是,当我使用 target_link_libraries 添加来自子项目的链接(来自 SDL2 的 SDL2-static,来自 CivetWeb 的 c-library)时,cmake 抱怨这些依赖项不在导出集中。

CMake Error: install(EXPORT "LIB_EXPORTS" ...) includes target "sc2api" which requires target "c-library" that is not in the export set.
CMake Error: install(EXPORT "LIB_EXPORTS" ...) includes target "sc2renderer" which requires target "SDL2-static" that is not in the export set.

我知道将目标添加到导出集的唯一方法是使用install(TARGETS ... EXPORT LIB_EXPORTS),但我们无法安装此子目录尚未创建的目标。如果我能确定生成该库文件的位置,我可以install(FILES ... EXPORT LIB_EXPORTS),但我觉得这会安装它两次(一次通过项目子目录中的 CMakeLists.txt,一次在这里)。坦率地说,我不确定为什么需要包含这些,因为这些库应该静态链接到我项目中的目标中。

我的问题:

  1. 我应该如何在导出集中包含这些外部目标?
  2. 如果不应该,安装导出集的正确方法是什么?
  3. 额外问题:这些子项目会自动将其安装目标添加到我项目的安装目标中。这是必要的吗?如果不是,我该如何禁用它?

【问题讨论】:

  • 非常好的问题,尤其是对于“现代”CMake。我使用ExternalProject trick 添加复制外部 git repo 然后 add_subdirectory 它们... -> 所以我可以修补我的所有依赖项说使用相同的导出名称或禁用它(正在进行中)cmake-external 3。我会说:尝试设置(CMAKE_SKIP_INSTALL_RULES TRUE)

标签: cmake


【解决方案1】:

我们无法安装此子目录尚未创建的目标

首先,这不是相当正确的。由于您使用add_subdirectory 添加依赖项,因此它们不是IMPORTED;这意味着它们是全局可见的,并且它们在项目中的哪个位置创建并不重要。重要的是它们是及时创建的,以便调用install(TARGETS)

一种方便的方法是将所有打包命令放在packaging/CMakeLists.txt 中,然后在顶级CMakeLists.txtend 处调用add_subdirectory(packaging),以便在第一个install() 电话。

然后您将目标添加到您的正常导出集:

install(TARGETS sc2api sc2renderer c-library SDL2-static
        EXPORT LIB_EXPORTS
        ...)

install(EXPORT LIB_EXPORTS ...)

这是首选的做事方式


坦率地说,我不确定为什么需要包含这些,因为这些库应该静态链接到我项目中的目标中。

它们可能有自己的使用要求,就像它们所依赖的其他库一样。因此,在导出时,CMake 需要重新创建与使用您的库相关的所有内容,包括所有传递依赖项。如果您绝对确定这永远不会成为问题,您可以使用$<BUILD_INTERFACE:...> 阻止导出依赖项。

add_library(sc2api SHARED)
target_link_libraries(sc2api PRIVATE $<BUILD_INTERFACE:c-library>)

这对于收集警告标志等的INTERFACE 库有时很有用,并将导出为空目标。

【讨论】:

  • 非常感谢!带有 $ 的 target_link_libraries 真的救了我。
猜你喜欢
  • 1970-01-01
  • 2013-11-27
  • 2013-10-18
  • 1970-01-01
  • 1970-01-01
  • 2020-06-18
  • 1970-01-01
  • 1970-01-01
  • 2019-02-21
相关资源
最近更新 更多