我正在尝试编写一个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,一次在这里).坦率地说,我不确定为什么包含这些是必要的,因为库应该静态链接到我的项目中的目标.
我的问题:
我们无法安装该子目录尚未创建的目标
首先,这并不完全正确。由于您使用的是添加依赖项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收集警告标志等的库很有用,并将导出为空目标。
| 归档时间: |
|
| 查看次数: |
930 次 |
| 最近记录: |