Nic*_*aus 3 c++ cmake guideline-support-library
我正在尝试使用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)
Run Code Online (Sandbox Code Playgroud)
这里的问题是只有头文件库没有lib来设置导入的路径,所以我不能使用IMPORTED库.如果我根本不使用库,那么我无法在GSL的其他模块中设置依赖关系,而无需每次都构建(即下载/解压缩),这是我不想做的.一个custom_target会有同样的问题,所以这是一个禁忌.
我想我想要的是一个接口库,就像
add_library(${TARGET_NAME} INTERFACE)
add_dependencies(${TARGET_NAME} ${TARGET_NAME}-ext)
Run Code Online (Sandbox Code Playgroud)
但随后cmake抱怨说
3rdParty/gsl/CMakeLists.txt上的CMake错误:33(add_dependencies):add_dependencies无法将目标级依赖项添加到INTERFACE库目标"gsl".
有没有我可以使用接口库(或其他东西)传播外部项目的依赖?