2010-05-13 88 views
5

我正在使用普通的X11应用程序。使用dlopen动态加载共享对象()

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

为了实现这种行为,我使用运行时加载,即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上,虽然LIB显然是有。 它只是附加了一个版本号。那么我的应用程序应该如何处理呢?
我应该让我的应用程序扫描/ usr/lib /第一个手动查看我们有哪些库,然后选择适当的?或者有没有人有更好的主意?

谢谢你们,

安迪

+0

也看到这里的答复: http://stackoverflow.com/questions/15951672/loading-linux-libraries-at-runtime – AjayKumarBasuthkar 2014-03-07 12:11:03

回答

1

你应该使用库的SONAME dlopen。你可以看到使用readelf -d [libname]

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

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

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

+0

大多数图书馆都向后兼容,这意味着具有较高soname的图书馆应该可以工作。假设你编写一个程序来加载'libc.so.6'。然后libc开发人员进行重大更新并发布'libc.so.7'。现在你的节目将不必要地打破,因为soname不匹配。 – 2014-07-10 10:51:23

+0

@BjörnLindqvist:不,大多数图书馆*不向后兼容。你从哪里得到这个想法?如果它们兼容,那么它们不会更改主版本号。 GNU libc已经有很长一段时间了。 – 2014-07-10 17:12:46

+0

您可以包含并使用提供的宏来加载各种glibc共享库。其他软件包可能会做类似的事情来提供加载哪个库的名称。以“man dlopen”为例。 – 2016-05-02 18:53:45

-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”为例。

+0

也看到这里的答复: http://stackoverflow.com/questions/15951672/loading -linux-libraries-at-runtime – AjayKumarBasuthkar 2014-03-07 12:22:06

+0

您绝对不应该裸露这个名字,只能由开发包提供,并且不会出现在生产部署系统上。 – 2016-05-02 18:48:53