安装EXPORT需要来自子项目

时间:2017-08-20 01:42:34

标签: cmake

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

我有一个superbuild结构,使用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. 奖金问题:这些子项目会自动将其安装目标添加到项目的安装目标中。这有必要吗?如果不是,我该如何禁用它?

1 个答案:

答案 0 :(得分:1)

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

首先,这不是相当。由于您要使用Module添加依赖项,因此它们不是add_subdirectory;这意味着它们是全局可见的,并且在项目中的何处创建都无关紧要。重要的是,它们是为调用IMPORTED而及时创建的。

一种方便的方法是将所有打包命令放在install(TARGETS)中,然后在顶层packaging/CMakeLists.txt end 处调用add_subdirectory(packaging),这样,每个目标已在第一次CMakeLists.txt调用之前创建。

然后将目标添加到常规导出集中:

install()

这是首选的处理方式


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

它们可能具有自己的使用要求,就像它们依赖的其他库一样。因此,在导出时,CMake需要重新创建与使用您的库相关的所有 ,包括所有传递依赖项。如果您绝对确定这永远不会成为问题,则可以使用install(TARGETS sc2api sc2renderer c-library SDL2-static EXPORT LIB_EXPORTS ...) install(EXPORT LIB_EXPORTS ...) 阻止导出依赖项。

$<BUILD_INTERFACE:...>

这有时对add_library(sc2api SHARED) target_link_libraries(sc2api PRIVATE $<BUILD_INTERFACE:c-library>) 库很有用,这些库收集警告标志或类似内容,并会导出为空目标。