I am developing an application that uses the GStreamer library. In order to ease deployment I would like to collect all the GStreamer libraries in a local bundle. For this I wrote a little script that does the following:
- recursively traverse dependencies (using
otool -L
) - copy all dependencies to a local directory
- make all the dependency paths relative to @executable_path (using
install_name_tool
)
(If you're interested you can have a look at the Ruby script.)
However, I'm now seeing runtime errors on the gst_init
call:
(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
These errors only occur if I use the localized libraries.
Are there certain 'common pitfalls' when it comes to using install_name_tool? Does anyone have an idea what I could be doing wrong? If you need to know certain details then feel free to ask.
Update
I changed a few things:
- For the dependent libraries I now only change the dylib paths and not the id (only use
install_name_tool -change
and notinstall_name_tool -id
). - For the main library I set the id value relative to the executable path (
@executable_name/components/Video.dylib
).
These two changes make it work. However it is not yet clear to me why it works. I have some trouble understanding the meaning of the "id" property. It seems to be identifier in the form of a pathname. Why did changing it for the dependent libraries cause runtime errors? I'll try to find answers to those questions with some further experimentation...