【发布时间】: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,一次在这里)。坦率地说,我不确定为什么需要包含这些,因为这些库应该静态链接到我项目中的目标中。
我的问题:
- 我应该如何在导出集中包含这些外部目标?
- 如果不应该,安装导出集的正确方法是什么?
- 额外问题:这些子项目会自动将其安装目标添加到我项目的安装目标中。这是必要的吗?如果不是,我该如何禁用它?
【问题讨论】:
-
非常好的问题,尤其是对于“现代”CMake。我使用ExternalProject trick 添加复制外部 git repo 然后 add_subdirectory 它们... -> 所以我可以修补我的所有依赖项说使用相同的导出名称或禁用它(正在进行中)cmake-external 3。我会说:尝试设置(CMAKE_SKIP_INSTALL_RULES TRUE)
标签: cmake