【问题标题】:propagate dependencies to header-only ExternalProject with cmake使用 cmake 将依赖项传播到仅限标头的 ExternalProject
【发布时间】:2016-02-25 14:55:47
【问题描述】:

我正在尝试使用 CMake (Microsoft/GSL) 构建一个仅包含标头的库,这样我就可以使用 GSL_INCLUDE_DIRSGSL_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 抱怨

3rdParty/gsl/CMakeLists.txt:33 (add_dependencies) 处的 CMake 错误: add_dependencies 无法将目标级别的依赖项添加到 INTERFACE 库 目标“gsl”。

有没有办法可以使用接口库(或其他东西)来传播对外部项目的依赖?

【问题讨论】:

  • 请澄清:“构建仅头文件库”,因为没有构建到 .lib、.so 或 .dll 文件。直接使用它们或设置适当的包含路径。
  • @knivil 我更新了问题标题以删除“构建”一词。也就是说,我认为我想使用 cmake 下载/解压缩仅标头库的问题相对明确,但只有在依赖项需要时才会调用外部项目。
  • 导入库的错误消息看起来很假。您的 cmake 版本是否真的支持 INTERFACE 库? TARGET_NAME 的值是多少?
  • @pmr 使用实际目标名称和完整的错误消息更新了问题。这不是假的。我正在使用 cmake 3.2.3 版,据我了解,接口库是在 3.0.0 中引入的。
  • 此外,我不知道 add_dependencies 调用的目的是什么。一个 INTERFACE 库不能有依赖关系,因为无论如何它都无能为力。

标签: c++ cmake guideline-support-library


【解决方案1】:

禁止对 INTERFACE 库的依赖是 an oversight that was corrected in CMake version 3.3。升级到最新的稳定版本后,我能够使用问题中描述的方法,并且完全符合预期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多