我正在使用普通的X11应用程序。
默认情况下,我的应用只需要libX11.so和标准的gcc C和数学库。 该应用程序可以扩展功能与Xfixes,Xrender和ALSA音响系统。 但是,这些(Xfixes,Xrender和ALSA)功能是可选的。
要实现此行为,我使用运行时加载,即libXrenes,libXrender和libasound应为dlopen()ed。
因此,App可以在没有这样的库的情况下运行。
现在我的问题:
What library names should I use when calling dlopen()?
我发现这些不同于发行版和发行版 例如,在openSUSE 11上,它们的名称如下:
但是,在Ubuntu上,名称附有版本号,如下所示:
因此尝试打开“libXfixes.so”会在Ubuntu上失败,尽管lib显然存在。 它只附有一个版本号。那么我的应用应如何处理呢? 我应该让我的应用程序首先手动扫描/ usr / lib /以查看我们有哪些库,然后选择合适的库?或者有没有人有更好的主意?
谢谢你们,
安迪
答案 0 :(得分:1)
你应该使用图书馆的SONAME。您可以使用readelf -d [libname]
。
例如,在我的一台Fedora Linux机器上,C库的SONAME是libc.so.6。
不保证从.so名称到.so.6名称的符号链接。这些符号链接仅用于编译软件,通常不安装在没有开发包的系统上。
您最不希望最终加载具有不同数字的版本,因为数字更改表明主要的API差异。
答案 1 :(得分:-1)
据我所知,你只是dlopen()
(例如)“libXfixes.so”,它最有可能成为最新文件“libXfixes.so.3”的符号链接,方式类似于这一个:
$ file /usr/lib/libalpm.so
/usr/lib/libalpm.so: symbolic link to `libalpm.so.4.0.3'
我的“/ usr / lib /”的快速概述显示,其中几乎每个库都有符号链接到它的最新“.X”编号文件,我确信它也是如何在其他分发上完成的。
仅当您需要特定版本的库时,才明确将版本命名为“libXfixes.so.2”。