#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. Создание общей библиотеки исправило это. Спасибо. У меня сложилось впечатление, что я уже строил его как общий, но это было неправильно.