我有一个需要特定版本库的程序(libgstreamer就是一个例子),因此旧版本不起作用。由于延迟链接,我的程序可能会链接到gstreamer版本10.23,它缺少我使用的10.25中存在的一些符号。我的问题是,如何在不使用包管理器的情况下检查安装了哪个版本的库。是否可以从C程序加载库,并使用dlopen()检查其版本号?
编辑:我正在研究Linux系统
编辑2:也许我可以使用readelf -V?
谢谢!
答案 0 :(得分:3)
我的问题是,我该如何检查哪一个 已安装库的版本 不使用包管理器 这样做。
首先,请注意在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
你可以在启动时调用此函数,如果版本不正确则挽救。
不过,我还是建议你不要再使用包经理了。它实际上是最轻松的机制,也允许用户轻松安装(如果您提供存储库)。
答案 1 :(得分:2)
当然,使用dlopen和dlsym函数加载库并测试您所依赖的符号是否存在。有关详细信息和代码示例,请参见手册页:http://linux.die.net/man/3/dlopen
答案 2 :(得分:0)
尝试使用 ltrace 或 strace
ltrace -f -e dlopen ./<theapp>
strace ./<theapp> 2>&1| grep 'dlopen.*'
PS!没有测试过自己