CMake `INSTALL` для целей и его SO зависимостей

Моя цель связана с несколькими библиотеками, используя TARGET_LINK_LIBRARIES с PUBLIC Ключевое слово INSTALL команда выглядит так INSTALL(TARGETS foo DESTINATION ${CMAKE_INSTALL_PREFIX}/bin), Я хочу каким-то образом заставить cmake включить все (предпочтительно исключая системные библиотеки) библиотеки (только SO), с которыми я связан, для включения в процесс установки. Я пробовал ключевое слово EXPORT, но похоже, что оно влияет только на библиотеки, которые я строю в своем проекте и помечены тем же EXPORT как foo библиотека.
Является ли это возможным?
EDIT001: дополнительная информация, которая может повлиять на ответ. Я использую vcpkg для управления третьими лицами. Итак TARGET_LINK_LIBRARIES похоже

TARGET_LINK_LIBRARIES(foo PUBLIC
                      GTest::GTest
                      GTest::Main
                      ${GOOGLE_MOCK}
                      event
                      ${THRIFT_LIBRARIES}
                      ${Boost_LIBRARIES}
                      lzo2
                      sqlite3
                      ${ZeroMQ_LIBRARY}
                      gRPC::grpc
                      gRPC::grpc++
                      xml2
                      stdc++fs
                      bfd
                      -l:libisal.so.2
                      sgutils2
                      pthread
                      uuid
                      rt
                      )

Итак, по сути, чего я хочу добиться, так это взять все эти библиотеки, которые vcpkg, лайк ${THRIFT_LIBRARIES}, ${Boost_LIBRARIES} and gRPC::grpc и так далее

2 ответа

Начиная с cmake 3.21, теперь вы можете использовать:

      install(IMPORTED_RUNTIME_ARTIFACTS gRPC::grpc)
install(IMPORTED_RUNTIME_ARTIFACTS g${Boost_LIBRARIES})

и т.п.

См. Новую команду установки .

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

Просто подумайте о переходных зависимостях (я не знаю, правильное ли это слово), например: libA зависит от libB, который зависит от libC, Как CMake должен получить это из CMakeLists, где только libB в списке?

Или: Что вы считаете системной библиотекой? Все, чего нет в PATH? Как вы узнаете, какие библиотеки установлены на компьютере клиента?

Видите ли, есть некоторые действительно сложные вещи, чтобы рассмотреть.

Вот некоторые возможности, которые у вас есть:

  • Попросите своих пользователей установить зависимости.
  • Статически связать библиотеки в ваш двоичный файл.
  • Скопируйте файлы библиотеки, используя install(FILES files... DESTINATION <dir>), Может быть, ваш менеджер зависимостей может помочь в создании списка файлов.
  • Напишите скрипт, который делает что-то вроде windeployqt для приложений на базе Qt в Windows: проанализируйте двоичный файл (например, используя ldd myApp) и автоматически копировать необходимые зависимости.
Другие вопросы по тегам