Как развернуть приложение, которое зависит от динамических библиотек? - PullRequest
9 голосов
/ 22 января 2010

Я разрабатываю приложение, которое использует библиотеку GStreamer. Чтобы упростить развертывание, я хотел бы собрать все библиотеки GStreamer в локальный комплект. Для этого я написал небольшой скрипт, который делает следующее:

  • рекурсивно-зависимые зависимости (используя otool -L)
  • скопировать все зависимости в локальный каталог
  • сделать все пути зависимости относительно @executable_path (используя install_name_tool)

(Если вам интересно, вы можете взглянуть на Ruby скрипт .)

Однако теперь я вижу ошибки времени выполнения при вызове gst_init:

(process:22843): GLib-GObject-CRITICAL **: gtype.c:2458: initialization assertion failed, use g_type_init() prior to this function

(process:22843): GLib-CRITICAL **: g_once_init_leave: assertion `initialization_value != 0' failed

Эти ошибки возникают только при использовании локализованных библиотек.


Существуют ли определенные «общие подводные камни», когда дело доходит до использования install_name_tool? У кого-нибудь есть идеи, что я могу делать не так? Если вам нужно знать определенные детали, не стесняйтесь спрашивать.

Обновление
Я изменил несколько вещей:

  • Для зависимых библиотек я теперь изменяю только пути dylib, а не id (используйте только install_name_tool -change и не install_name_tool -id).
  • Для основной библиотеки я установил значение id относительно пути к исполняемому файлу (@executable_name/components/Video.dylib).

Эти два изменения заставляют его работать. Однако мне пока не ясно, почему это работает. У меня возникли проблемы с пониманием значения свойства "id". Кажется, это идентификатор в виде пути. Почему изменение его для зависимых библиотек привело к ошибкам во время выполнения? Я постараюсь найти ответы на эти вопросы с дальнейшими экспериментами ...

Ответы [ 2 ]

1 голос
/ 22 июня 2010

возможно, вам стоит рассмотреть статическую компиляцию вашего кода. это намного лучше прикрепит ваши зависимости к вашей программе

если вы используете gcc, просто добавьте -static

0 голосов
/ 28 июня 2010

GStreamer - сложная система с множеством зависимостей. Используя инструменты, вы обнаружите общие библиотеки, которые прямо необходимы GStreamer, но они наверняка пропустят динамически загружаемые библиотеки, файлы конфигурации и данные перевода.

Этот сайт, вероятно, содержит некоторую полезную информацию о создании автономного пакета GStreamer, который может упростить процесс объединения.

...