Почему не работает find_dependency(GSL) для экспортированной библиотеки интерфейса?

Я написал некоторую библиотеку только для заголовков, например:

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», но цель не найдена. Возможно, отсутствует вызов find_package() для цели IMPORTED или отсутствует цель ALIAS?

и аналогичное сообщение об ошибке для компонента gslcblas. Однако, включив библиотеку как

find_package(testLib)
find_package(GSL)

Сообщение об ошибке исчезнет. Обратите внимание, что аналогичные знания об используемом библиотечном бусте клиенту не нужны. Я делаю что-то не так?


person Mojomoko    schedule 16.04.2018    source источник


Ответы (1)


Проблема, похоже, заключается в более раннем вызове find_package. При удалении вызова find_package (только перенаправление зависимости с помощью find_dependency) клиенту библиотеки интерфейса не требуется дополнительный вызов find_package. Я предполагаю, что проблема в том, что find_dependency действительно является макросом. При первом вызове find_package переменные устанавливаются в значение found, и клиент не вызывает второй вызов find_package...?

person Mojomoko    schedule 18.06.2018
comment
У меня похожая проблема с GSL: если я настраиваю и генерирую за один раз, это работает, но если я сначала настраиваю, а затем генерирую (используя ccmake), то получаю печально известную target was not found при создании Makefile. Код в вашем исходном вопросе выглядит хорошо для меня. Не могли бы вы подробнее рассказать о своем решении? - person Samuel; 23.01.2019