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

时间:2010-01-22 17:14:51

标签: c++ macos dynamic-linking install-name-tool

我正在开发一个使用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时是否存在某些“常见陷阱”?有谁知道我可能做错了什么?如果您需要了解某些细节,请随时询问。

更新
我改变了一些事情:

  • 对于依赖库,我现在只更改dylib路径而不是id(仅使用install_name_tool -change而不是install_name_tool -id)。
  • 对于主库,我设置了相对于可执行路径(@executable_name/components/Video.dylib)的id值。

这两项变化使其有效。但是,我还不清楚它为什么会起作用。我在理解“id”属性的含义时遇到了一些麻烦。它似乎是路径名形式的标识符。为什么为依赖库更改它会导致运行时错误?我会尝试通过一些进一步的实验来找到这些问题的答案......

2 个答案:

答案 0 :(得分:1)

也许您应该考虑对代码进行静态编译。 这将更好地将您的依赖项附加到您的程序

如果你正在使用gcc,只需添加-static

答案 1 :(得分:0)

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

This site probably contains some usefull info创建一个独立的GStreamer软件包,可以简化捆绑的prpcess。