我正在尝试编写一个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,一次在这里)。坦率地说,我不确定为什么包含这些是必要的,因为库应该静态链接到我的项目中的目标。
我的问题:
答案 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>)
库很有用,这些库收集警告标志或类似内容,并会导出为空目标。