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.升级到最新稳定版本后,我能够使用问题中描述的方法,并且它完全按照预期工作.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...