【问题标题】:checking version of C library (dynamic loading)检查 C 库的版本(动态加载)
【发布时间】:2011-05-25 09:59:25
【问题描述】:

我有一个程序需要特定版本的库(例如 libgstreamer),因此旧版本将无法运行。由于延迟链接,我的程序可能会链接到 gstreamer 版本 10.23,它缺少我使用的 10.25 中存在的一些符号。我的问题是,如何在不使用包管理器的情况下检查安装了哪个版本的库。是否可以从 C 程序加载库并使用 dlopen() 检查其版本号?

编辑:我正在使用 Linux 系统

编辑 2:也许我可以使用 readelf -V ?

谢谢!

【问题讨论】:

  • 可能您可以链接到 libgstreamer.so.X.XX 而不是 libgstreamer.so。另请看:faqs.org/docs/Linux-HOWTO/…
  • 在 Windows 上,您只需在应用程序清单中指定依赖程序集的最低可接受版本号,操作系统会处理它。可悲的是,posix 开发人员仍然认为针对版本化软链接系统的链接更优越,而 windows 开发人员不知道如何为共享组件创建程序集。
  • @RedX:为什么不把它放在答案中?
  • @RedX:是的,应该可以。但是,这会将程序锁定为恰好一个版本,而通常只需要某个最低版本。

标签: c linux unix gcc dynamic-linking


【解决方案1】:

我的问题是,我如何检查哪个 已安装库的版本 不使用包管理器 这样做。

首先,请注意,在 Linux 上处理此问题的常用且公认的机制正是让包管理器检查它——这是发明它们的主要原因之一。

另一个常见的选项是在从源代码构建时签入您的configure 脚本或Makefile

如果你想提供预编译的二进制文件,但不使用包管理器,我相信最好的机制是检查库是否有一些内部机制来在运行时检索其版本。不幸的是,这对于您链接的每个库都是特定的。

幸运的是,GStreamer 有这个:

void gst_version(guint *major, guint *minor, guint *micro, guint *nano);
Gets the version number of the GStreamer library.

http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstVersion.html

你可以在启动的时候调用这个函数,如果版本不对就退出。

不过,我还是敦促您重新考虑不要使用包管理器。它确实是处理这个问题的最轻松的机制,并且还允许用户轻松安装(如果您提供存储库)。

【讨论】:

  • 感谢您的回答。目前我确实使用了包管理器,问题在于为不同的发行版维护各种脚本成为一个问题。更糟糕的是,它根本不适用于使用我们没有提供脚本的包管理器的系统(比如 arch linux 或 slackware)。
  • @lordsandwich:啊,我明白了。好吧,您总是可以将您的支持限制在一些流行的发行版(及其衍生产品),并告诉其他人手动完成这些工作。使用 slackware 的人应该能够自己检查 .so 版本:-)。
【解决方案2】:

当然,使用 dlopen 和 dlsym 函数来加载库并测试您所依赖的符号是否存在。有关详细信息和代码示例,请参见手册页:http://linux.die.net/man/3/dlopen

【讨论】:

  • 我确实想到了这一点,但是符号列表很长(因为我需要检查很多库)。鉴于我知道哪个版本包含所需的所有符号,我更愿意使用检查版本号的解决方案。有没有办法使用 dlsym() 进行版本检查?我在手册页上找不到任何相关内容。
  • 来自我上面引用的手册页:'函数 dlvsym() 与 dlsym() 功能相同,但将版本字符串作为附加参数。'
【解决方案3】:

尝试使用 ltracestrace

ltrace -f -e dlopen ./<theapp>
strace ./<theapp> 2>&1| grep 'dlopen.*'

PS!没有测试过自己

【讨论】:

  • 显示的 dlopen 调用未显示动态加载的库版本。
  • 另外,我认为这不会有帮助,因为问题是关于从程序内部执行此操作(尽管您原则上可以从程序运行命令)。
  • hmm, forums.purebasic.com/english/viewtopic.php?f=23&t=45962 建议这样做,在您的情况下它会输出什么?如果它只是说 libgstreamer.so 你需要检查它是什么 libgstreamer.so.X.XX 文件的链接。
  • 它确实说 libgstreamer.so,0.10。这意味着它不包括最后一个(也是重要的版本号,我需要 libgstreamar 0.10.25 或更高版本。
猜你喜欢
  • 2013-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
  • 2015-11-14
  • 1970-01-01
  • 2011-10-21
相关资源
最近更新 更多