【问题标题】:Why is find_dependency(GSL) failing for exported interface library?为什么导出接口库的 find_dependency(GSL) 失败?
【发布时间】:2018-04-16 08:09:53
【问题描述】:

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

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)

我得到错误:

目标“importTest”链接到目标“GSL::gsl”,但目标不是 成立。 IMPORTED 目标可能缺少 find_package() 调用,或者 缺少 ALIAS 目标?

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

find_package(testLib)
find_package(GSL)

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

【问题讨论】:

    标签: c++ cmake gsl


    【解决方案1】:

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

    【讨论】:

    • 我对 GSL 有类似的问题:如果我一次性配置和生成,它可以工作,但如果我先配置然后生成(使用ccmake),那么我会得到臭名昭著的target was not found生成 Makefile。您原始问题中的代码对我来说看起来不错。您能否详细说明您的解决方案?
    猜你喜欢
    • 1970-01-01
    • 2022-11-04
    • 2018-12-25
    • 2018-10-14
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    相关资源
    最近更新 更多