为什么 find_dependency(GSL) 导出接口库失败?

Why is find_dependency(GSL) failing for exported interface library?

我写了一些只有头文件的库,比如:

cmake_minimum_required(VERSION 3.10)
add_library(testLib INTERFACE)
...
find_package(GSL REQUIRED)
find_package(Boost 1.32 REQUIRED)
target_link_libraries(testLib INTERFACE Boost::boost GSL::gsl GSL::gslcblas)

并在 testLibConfig.cmake 文件中写道:

include(CMakeFindDependencyMacro)
find_dependency(GSL)
find_dependency(Boost 1.32)
include("${CMAKE_CURRENT_LIST_DIR}/testLibTargets.cmake")

但是当我尝试像这样使用它时:

find_package(testLib)

我收到错误:

Target "importTest" links to target "GSL::gsl" but the target was not found. Perhaps a find_package() call is missing for an IMPORTED target, or an ALIAS target is missing?

以及 gslcblas 组件的类似错误消息。但是,通过将库包含为

find_package(testLib)
find_package(GSL)

错误信息消失。请注意,客户端不需要有关使用的库提升的类似知识。我做错了什么吗?

问题似乎出在较早的 find_package 调用上。通过删除 find_package 调用(仅使用 find_dependency 转发依赖项),接口库的客户端不需要额外的 find_package 调用。 我想问题是 find_dependency 确实是一个宏。通过首先调用 find_package 将变量设置为已找到,并且客户端不会调用第二个 find_package 调用...?