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
) и автоматически копировать необходимые зависимости.