使用cmake

时间:2016-02-25 14:55:47

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

我尝试使用CMake(Microsoft/GSL)构建仅限标头的库,这样我就可以使用GSL_INCLUDE_DIRSGSL_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上的其他模块中设置依赖关系,而无需每次构建(即下载/解压缩) ,我不会#39; t想做。 custom_target会遇到同样的问题,因此不行。

我认为我想要的是一个接口库,比如

add_library(${TARGET_NAME} INTERFACE)
add_dependencies(${TARGET_NAME} ${TARGET_NAME}-ext)

然后cmake抱怨

  

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

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

1 个答案:

答案 0 :(得分:7)

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