CMake `INSTALL` для целей и его SO зависимостей - PullRequest
0 голосов
/ 30 августа 2018

Моя цель связана с несколькими библиотеками, используя 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 и т. Д.

1 Ответ

0 голосов
/ 31 августа 2018

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

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

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

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

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

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