gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 16:48:24 30 4
gpt4 key购买 nike

我正在开发一个使用 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)。
  • 对于主库,我设置了相对于可执行路径的 id 值 (@executable_name/components/Video.dylib)。

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

最佳答案

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

如果你使用的是 gcc,只需添加 -static

关于c++ - 如何部署依赖动态库的应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2119054/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com