使用dlopen()动态加载共享对象

时间:2010-05-13 13:36:01

标签: linux x11 dlopen binutils

我正在使用普通的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上,它们的名称如下:

  • libXfixes.so
  • libXrender.so
  • libasound.so

但是,在Ubuntu上,名称附有版本号,如下所示:

  • libXfixes.so.3
  • libXrender.so.1
  • libasound.so.2

因此尝试打开“libXfixes.so”会在Ubuntu上失败,尽管lib显然存在。 它只附有一个版本号。那么我的应用应如何处理呢? 我应该让我的应用程序首先手动扫描/ usr / lib /以查看我们有哪些库,然后选择合适的库?或者有没有人有更好的主意?

谢谢你们,

安迪

2 个答案:

答案 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”。