При создании MACOSX_BUNDLE в CMake, как скопировать связанные динамические библиотеки в пакет?

Мы создаем приложение OS X, выпущенное в комплекте .app. Управление сборкой реализовано с помощью CMake. Это приложение зависит как от целевых CMake библиотек (возможно, импортированных), так и от библиотек, доступных в xxx_LIBRARIESvariables, заполняемых сценариями Findxxx.cmake. Схема CMakeLists.txt может быть следующей:

project(OSX_Bundle)

add_executable(${PROJECT_NAME} MACOSX_BUNDLE main.mm )

target_include_directories(${PROJECT_NAME}  PRIVATE
                           ${LibA_INCLUDE_DIRS} )

target_link_libraries(${PROJECT_NAME}
                      ${LibA_LIBRARIES}
                      LibB
                      "-framework Cocoa" )

Теперь нам нужно скопировать и LibA.dylib, и LibB.dylib в канонический OSX_Bundle.app/Contents/Frameworks. Эта копия должна быть сделана для приложения в дереве сборки, а также в дереве установки. Несмотря на то, что это может показаться базовой задачей, мы не можем найти хороший ресурс в Интернете, объясняющий лучший способ (способы) решения этой проблемы.


person Ad N    schedule 28.07.2015    source источник
comment
возможный дубликат CMake: копирование фреймворков в пакет приложений   -  person Hasturkun    schedule 28.07.2015
comment
@Hasturkun Спасибо за ссылку. К сожалению, кажется, что fixup_bundle применяется только к дереву установки (по крайней мере, это то, что я делаю из всего примера, используя его в команде INSTALL).   -  person Ad N    schedule 28.07.2015
comment
Я не использовал его, но похоже, что FIXUP_BUNDLE работает на месте, поэтому я думаю, что он должен работать для вас (но опять же, я не проверял его)   -  person Hasturkun    schedule 28.07.2015
comment
Я бы рекомендовал использовать bash для захвата библиотек и настройки имен установки.   -  person Richard Barber    schedule 26.02.2021


Ответы (1)


Многие люди сталкиваются с этой проблемой. Вы можете попробовать один из этого списка:

  • команду CMake post-buld и вызовите "macdeployqt" здесь; но это может замедлить сборку (выражения генератора CMake также дадут вам правильный путь и двоичный файл для Xcode/VS)
  • или пользовательская команда CMake, снова с помощью macdeployqt, если вы этого не сделаете. хотите запускать его всегда, тогда его можно будет запускать вручную, когда это необходимо
  • возможны зависимости пакета на этапе установки, как указано в комментариях выше.
  • можно использовать CPack, это даст вам новую цель «пакет»; после игры с CMake/CPack он может собрать все необходимое (использует упомянутый выше установочный материал) и сгенерировать окончательный установщик

Я думаю, последняя пуля должна соответствовать вашим потребностям.

person Ľubomír Carik    schedule 22.04.2018
comment
Введение Qt в качестве зависимости — большая просьба. - person Rotsiser Mho; 27.08.2019
comment
Объединение библиотек Qt работает гладко, единственная проблема - это плагины Qt, например. Материал QtQuick, который все еще открыт/обсуждается в отчетах об ошибках спустя много лет... (т. е. требует специальных шагов для объединения всего материала в окончательный двоичный файл) - person Ľubomír Carik; 27.08.2019
comment
Этот вопрос не имеет ничего общего с Qt, поэтому я думаю, что введение его в качестве зависимости от проекта только для использования macdeployqt не является хорошим решением. - person Rotsiser Mho; 31.08.2019
comment
Использование macdeployqt не обязательно приведет к каким-либо зависимостям Qt, оно официально не поддерживает сторонние библиотеки (хотя иногда это работает). - person Richard Barber; 28.10.2019