安装EXPORT需要来自子项目的目标

Bra*_*edy 12 cmake

我正在尝试编写一个cmake脚本来安装我正在处理的项目.这部分是必要的install(EXPORT LIB_EXPORTS ...)地方LIB_EXPORTS是我一直在使用我的各种出口资产install(TARGETS ...).

我有一个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.
Run Code Online (Sandbox Code Playgroud)

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

我的问题:

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

Ale*_*ing 5

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

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

一种方便的方法是将所有打包命令放入其中packaging/CMakeLists.txt,然后add_subdirectory(packaging)在顶层末尾CMakeLists.txt调用,以便在第一次调用之前创建每个目标install()

然后,您可以将目标添加到正常导出集中:

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

install(EXPORT LIB_EXPORTS ...)
Run Code Online (Sandbox Code Playgroud)

这是首选的做事方式


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

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

add_library(sc2api SHARED)
target_link_libraries(sc2api PRIVATE $<BUILD_INTERFACE:c-library>)
Run Code Online (Sandbox Code Playgroud)

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