CMake Ошибка: ЦЕЛЯМ не дано БИБЛИОТЕЧНОЕ НАЗНАЧЕНИЕ для цели общей библиотеки
При создании проекта с открытым исходным кодом с помощью CMake (в моем случае это была библиотека графов лимонов), я получал эту ошибку, когда пытался создать общие библиотеки с помощью -DBUILD_SHARED_LIBS=1
:
TARGETS given no LIBRARY DESTINATION for shared library target
Откуда эта ошибка и как ее исправить?
6 ответов
В моем CMakeLists.txt
, моя команда INSTALL не имела параметра LIBRARY.
Изменение от этого:
INSTALL(
TARGETS lemon
ARCHIVE DESTINATION lib
COMPONENT library
)
к этому:
INSTALL(
TARGETS lemon
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib # <-- Add this line
COMPONENT library
)
исправил мою проблему.
Я получил это... Еще одна причина, по которой это происходит, когда вы создаете общую библиотеку
add_library(источники ${NAME} SHARED)
затем, когда Cmake достигает команды установки на платформе Windows, он жалуется на эти ошибки, решение состоит в том, чтобы использовать RUNTIME вместо LIBRARY, как
if(WIN32)
install(TARGETS ${NAME}
RUNTIME DESTINATION path)
else()
install(TARGETS ${NAME}
LIBRARY DESTINATION path)
endif()
После DESTINATION
должно иметь bin
, lib
, include
,
устанавливать lib
или же bin
install(TARGETS snappy
EXPORT SnappyTargets
# RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} # DESTINATION error
RUNTIME DESTINATION bin ${CMAKE_INSTALL_BINDIR} # should add bin or other dir
LIBRARY DESTINATION lib ${CMAKE_INSTALL_LIBDIR}
# ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR # DESTINATION error
ARCHIVE DESTINATION lib ${CMAKE_INSTALL_LIBDIR} # should add lib
)
Например, установить .h
файл:
install(
FILES
"${PROJECT_SOURCE_DIR}/test_hard1.h"
"${PROJECT_BINARY_DIR}/config.h"
# DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} # error install FILES given no DESTINATION!
# add include after DESTINATION, then it works
DESTINATION include ${CMAKE_INSTALL_INCLUDEDIR}
)
см. https://cmake.org/cmake/help/v3.0/command/install.html для более подробной информации:
install(TARGETS myExe mySharedLib myStaticLib
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib/static)
install(TARGETS mySharedLib DESTINATION /some/full/path)
Я столкнулся с похожей проблемой. Как сказал @Fernando в своем ответе, вы можете пойти с этим решением. Другое подобное решение - простоinclude(GNUInstallDirs)
include(GNUInstallDirs)
install(TARGETS ${PROJECT_NAME}
EXPORT "${PROJECT_NAME}Config"
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
У меня было похожее, но не идентичное сообщение об ошибке:
CMake Error at xxx/CMakeLists.txt:123 (install):
install Library TARGETS given no DESTINATION!
Исправление в этом случае состояло в том, чтобы просто обновить CMake; с версии 3.13.3 до 3.25.1 или любой более новой версии.
Примечание. Первоначально я разместил свой собственный вопрос в CMake Error: install Library TARGETS без DESTINATION , но он был закрыт как дубликат (хотя сообщение об ошибке было другим), поэтому я разместил здесь свой собственный ответ.
Я не знаю, исправит ли этоTARGETS given no LIBRARY DESTINATION for shared library target
ошибка.
Во всех других ответах говорится об изменении файлов конфигурации CMake (например, CMakeLists.txt), поэтому этот ответ является новым и более простым.
Наше исправление состояло в том, чтобы просто обновить и оставить конфигурацию в покое. Поскольку ошибка была выброшена из другого проекта с открытым исходным кодом, для нас это было намного лучшим решением.
Начиная с CMake 3.14 параметр DESTINATION больше не требуется для исполняемых файлов, общих/статических библиотек и некоторых других артефактов: CMake предоставляет разумные значения по умолчанию для их установочных каталогов. В качестве альтернативы можно включить модуль GNUInstallDirs и установить соответствующийCMAKE_INSTALL_<dir>
переменная.
Для обычных исполняемых файлов, статических и общих библиотек аргумент не требуется. Для этих типов целей, когда
DESTINATION
опущен, место назначения по умолчанию будет взято из соответствующей переменной изGNUInstallDirs
или установите встроенное значение по умолчанию, если эта переменная не определена. То же самое верно для общедоступных и частных заголовков, связанных с установленными целями черезPUBLIC_HEADER
иPRIVATE_HEADER
целевые свойства.
https://cmake.org/cmake/help/v3.14/command/install.html#цели