5

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

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

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

因此,该应用程序可以在没有此类库的情况下运行。

现在我的问题:

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

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

多谢你们,

安迪

4

2 回答 2

1

您应该使用库的 SONAME 进行 dlopen。您可以通过使用readelf -d [libname].

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

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

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

于 2010-05-13T14:16:46.757 回答
-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”。

于 2010-05-13T13:40:43.743 回答