我正在开发一个使用 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
)。 - 对于主库,我设置了相对于可执行路径 (
@executable_name/components/Video.dylib
) 的 id 值。
这两个变化使它工作。但是,我还不清楚它为什么起作用。我在理解“id”属性的含义时遇到了一些麻烦。它似乎是路径名形式的标识符。为什么为依赖库更改它会导致运行时错误?我将尝试通过进一步的实验找到这些问题的答案......