Как развернуть приложение, которое зависит от динамических библиотек?

Я разрабатываю приложение, которое пользуется библиотекой 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 а не идентификатор (только использование install_name_tool -change и нет install_name_tool -id).
  • Для основной библиотеки я установил значение идентификатора относительно исполняемого пути (@executable_name/components/Video.dylib).

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

9
задан StackedCrooked 23 January 2010 в 06:27
поделиться

2 ответа

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

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

1
ответ дан 3 November 2019 в 09:30
поделиться

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

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

0
ответ дан 3 November 2019 в 09:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: