使用 cmake 将依赖项传播到仅标头的外部项目
propagate dependencies to header-only ExternalProject with cmake
我正在尝试使用 CMake (Microsoft/GSL) 构建一个仅标头库,这样我就可以使用 GSL_INCLUDE_DIRS
和 GSL_LIBRARIES
等变量链接到目标并传播适当的依赖项。
我正在处理的项目有一堆子目录,所有外部项目都构建在自己的子目录中,因此变量很重要。
我正在使用 CMake 3.2.3
通常(对于具有实际 .lib 或 .a 的库)我会做这样的事情:
SET(TARGET_NAME gsl)
include(ExternalProject)
ExternalProject_Add(
${TARGET_NAME}-ext
URL "http://target/url"
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
) # download/unzip the header-only project
# Specify include dir
SET(${TARGET_NAME}_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/include CACHE STRING "${TARGET_NAME} include directory")
# Library
add_library(${TARGET_NAME} SHARED IMPORTED GLOBAL)
SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES
IMPORTED_LOCATION "some/path/to/some/lib"
)
add_dependencies(${TARGET_NAME} ${TARGET_NAME}-ext)
SET(${TARGET_NAME}_LIBRARIES ${TARGET_NAME} CACHE STRING "${TARGET_NAME} library location")
MARK_AS_ADVANCED(${TARGET_NAME_UPPER}_DIR ${TARGET_NAME_UPPER}_INCLUDE_DIRS ${TARGET_NAME_UPPER}_LIBRARIES)
这里的问题是仅标头库没有用于设置导入路径的库,因此我无法使用IMPORTED
库。如果我根本不使用库,那么我就无法在不每次构建(即下载/解压缩)的情况下在 GSL 上的其他模块中设置依赖项,这是我不想做的。 custom_target
会遇到同样的问题,所以这是不行的。
我认为我想要的是一个界面库,类似于
add_library(${TARGET_NAME} INTERFACE)
add_dependencies(${TARGET_NAME} ${TARGET_NAME}-ext)
但随后 Cmake 抱怨说
CMake Error at 3rdParty/gsl/CMakeLists.txt:33 (add_dependencies): add_dependencies 无法将目标级依赖项添加到接口库 目标"GSL"。
有没有办法使用接口库(或其他东西)来传播对外部项目的依赖关系?
不允许对INTERFACE
库的依赖是一个疏忽,在 CMake 版本 3.3 中得到了纠正。升级到最新稳定版本后,我能够使用问题中描述的方法,并且它完全按照预期工作。
相关文章:
- 使外部项目可用于find_package CMake
- 链接导入的库与CMAKE外部项目
- 使用 CMake 外部项目为跨平台库依赖项的目标名称
- 如何获取外部项目定义的目标的输出路径?
- cmake:add_depentencies不适用于外部项目
- cmake-包括外部项目的目录
- CMake:重建外部项目
- 如何为 CMAKE 外部项目指定编译器
- 如何将正确的库与 GLFW 链接为 cmake 中的外部项目
- CMAKE:外部项目更新和离线工作
- CMake:包含外部项目的错误
- 如何将 CMake 参数转发到外部项目
- CMake:GLFW作为外部项目
- 使用 cmake 将依赖项传播到仅标头的外部项目
- CMake:从外部项目链接共享C++对象会生成具有相对路径的二进制文件,而不是绝对路径
- 代码使用cmake干净地构建,当作为外部项目添加时失败
- 将cmake构建选项导出到外部项目
- 添加预处理器定义到cmake外部项目
- 为外部项目设置RPATH
- 通过cmake链接openv库作为外部项目