Я разрабатываю приложение, которое использует библиотеку 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". Кажется, это идентификатор в виде пути. Почему изменение его для зависимых библиотек привело к ошибкам во время выполнения? Я постараюсь найти ответы на эти вопросы с дальнейшими экспериментами ...