我正在尝试使用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 举报,一经查实,本站将立刻删除。