使用dlopen()dynamic加载共享对象

我正在做一个普通的X11应用程序。

默认情况下,我的应用只需要libX11.so和标准的gcc C和math库。 该应用程序可以扩展Xfixes,Xrender和ALSA声音系统的function。 但是,这些(Xfixes,Xrender和ALSA)function是可选的。

为了实现这种行为,我使用运行时加载,即libXfixes,libXrender和libasound应该是dlopen()。

因此,应用程序可以运行在没有这样的图书馆。

现在我的问题:

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上失败,虽然显然在那里。 它只是附有一个版本号。 那么我的应用程序应该如何处理呢?
我应该让我的应用程序扫描/ usr / lib /第一个手动查看我们有哪些库,然后select一个合适的? 还是有没有人有一个更好的主意?

多谢你们,

安迪

你应该使用图书馆的SONAME。 你可以看到使用readelf -d [libname]

例如,在我的一个Fedora Linux机器上,C库的SONAME是libc.so.6。

.so名称到.so.6名称的符号链接不能保证。 这些符号链接仅用于编译软件,通常不安装在没有开发包的系统上。

您不希望最终加载具有不同编号的版本,因为编号更改表示主要的API差异。

从我学到的东西,你只是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”。