微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – 使用cmake将依赖项传播到仅头文件的ExternalProject

我正在尝试使用CMake( Microsoft/GSL)构建一个仅包含头的库,这样我就可以使用GSL_INCLUDE_Dirs和GSL_LIBRARIES等变量链接到目标并传播相应的依赖项.

我正在研究的项目有一个TON的子目录,所有的外部项目都建在自己的子目录中,因此变量很重要.

我正在使用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 Cannot add target-level dependencies to INTERFACE library
target “gsl”.

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

解决方法

不允许对INTERFACE库的依赖是 an oversight that was corrected in CMake version 3.3.升级到最新稳定版本后,我能够使用问题中描述的方法,并且它完全按照预期工作.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐