如何部署依赖动态库的应用程序?

9
我正在开发一个使用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”属性的含义是什么。它似乎是一个路径名形式的标识符。为什么更改依赖库的ID会导致运行时错误?我将尝试通过进一步实验找到答案...


你是否可能无意中影响了各个依赖项的加载顺序? - Georg Fritzsche
@gf:我不这么认为,但我会记住的。如果你感兴趣,可以查看编辑后的内容,我已经取得了一些进展。 - StackedCrooked
你难道不是在构建一个 .app 包吗? - Warren P
2个回答

1
也许你应该考虑对你的代码进行静态编译。 这样可以更好地将依赖项附加到程序中。
如果你正在使用gcc,只需添加-static即可。

0

GStreamer是一个复杂的系统,具有许多依赖项。使用工具可以找到GStreamer直接需要的共享库,但它们肯定会漏掉动态加载的库、配置文件以及翻译数据。

这个网站可能包含一些有用的信息,关于创建一个独立的GStreamer软件包,这可以简化打包过程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接