gpt4 book ai didi

c++ - 使用 cmake 将依赖项传播到仅 header 的 ExternalProject

转载 作者:太空狗 更新时间:2023-10-29 20:10:56 26 4
gpt4 key购买 nike

我正在尝试使用 CMake ( Microsoft/GSL ) 构建一个仅包含 header 的库,这样我就可以使用 GSL_INCLUDE_DIRSGSL_LIBRARIES 之类的变量来链接到目标并传播适当的依赖项。

我正在处理的项目有很多子目录,所有外部项目都构建在它们自己的子目录中,因此变量很重要。

我正在使用 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)

这里的问题是只有 header 的库没有用于设置导入路径的库,所以我不能使用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)库(或其他东西)传播对外部项目的依赖?

最佳答案

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

关于c++ - 使用 cmake 将依赖项传播到仅 header 的 ExternalProject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35630755/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com