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

And*_*ndy 5 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()?  
Run Code Online (Sandbox Code Playgroud)

我发现这些不同于发行版和发行版.
例如,在openSUSE 11上,它们的名称如下:

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

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

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

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

多谢你们,

安迪

Zan*_*ynx 2

您应该使用库的 SONAME 进行 dlopen。您可以通过使用来看到这一点readelf -d [libname]

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

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

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