CMake: Целевые ссылки на цель транзитивной зависимости, но цель не была найдена

#c #cmake

Вопрос:

У меня есть простая настройка cmake между двумя проектами, библиотечным проектом и исполняемым проектом. Проект библиотеки, который я хочу установить в системе (контейнер Linux), и исполняемый проект, который я хочу связать с пакетом библиотеки после его поиска с помощью find_package(XXX CONFIG). Я успешно создаю и устанавливаю проект библиотеки просто отлично, однако, когда я настраиваю исполняемый проект, я получаю ошибку в духе

Ошибка CMake в MyExecutable/CMakeLists.txt:35 (add_executable): Цель «MyExecutable» ссылается на цель «CUDA::инструментарий», но цель не найдена. Возможно, для ИМПОРТИРОВАННОГО целевого объекта отсутствует вызов find_package() или отсутствует цель псевдонима?

CUDA::toolkit-это ЧАСТНАЯ цель, связанная с библиотечным проектом.

В CMakeLists.txt для библиотеки проект выглядит так

 add_library(SiftCuda ${SOURCES} ${CUDA_KERNELS}) target_link_libraries(MyLibrary PRIVATE  CUDA::cudart  CUDA::cublas )  set_target_properties(MyLibrary PROPERTIES   PUBLIC_HEADER "${HEADERS}"   CUDA_SEPARABLE_COMPILATION ON )  target_include_directories(MyLibrary PUBLIC  $lt;BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/includegt;   $lt;INSTALL_INTERFACE:include/MyLibrarygt; )  target_compile_features(MyLibrary PUBLIC   cxx_std_11 )  # Alias library add_library(MyLibrary::MyLibrary ALIAS MyLibrary)  ###### Installation ##### include(GNUInstallDirs)  # Install library install(TARGETS MyLibrary  EXPORT MyLibraryConfig  PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/MyLibrary )  # For exposing internal configuration of the package export(  TARGETS MyLibrary  NAMESPACE MyLibrary::  FILE "${CMAKE_CURRENT_BINARY_DIR}/MyLibraryConfig.cmake" )  # Install exports install(EXPORT MyLibraryConfig  DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/MyLibrary"  NAMESPACE MyLibrary:: )  

В CMakeLists.txt для исполняемого файла выглядит так

 find_package(MyLibrary CONFIG) add_executable(MyExe  ${SOURCES} )  target_link_libraries(MyExe PUBLIC  MyLibrary::MyLibrary )  

У меня такое чувство, что привязка моего приложения к целям CUDA решила бы эту проблему, однако это кажется неправильным, поскольку мне обычно не нужно знать о переходных зависимостях для библиотек, которые я использую.

Комментарии:

1. Является MyLibrary ли библиотека общей или статической ? Хотя вы можете в частном порядке связать статическую библиотеку с помощью target_link_libraries , эта связь все равно передается потребителю этой библиотеки.

2. Создание общей библиотеки исправило это. Спасибо. У меня сложилось впечатление, что я уже строил его как общий, но это было неправильно.