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#цели

Другие вопросы по тегам