2010-01-22 3 views
8

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

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

(Если вы заинтересованы вы можете посмотреть на Ruby script.)

Тем не менее, я теперь видящие ошибки во время выполнения на 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? Кто-нибудь есть идея, что я могу делать неправильно? Если вам нужно знать определенные детали, то не стесняйтесь спрашивать.

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

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

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

+0

Возможно, вы случайно повлияли на порядок загрузки для соответствующих зависимостей? –

+0

@gf: Я так не думаю, но я буду иметь это в виду. Я сделал некоторый прогресс, проверьте редактирование, если вам интересно. – StackedCrooked

+0

Разве вы не строите пакет .app? –

ответ

1

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

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

0

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

This site probably contains some usefull info о создании автономного пакета GStreamer, который может упростить связывание prpcess.

Смежные вопросы