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

发布于 2024-09-01 06:34:06 字数 709 浏览 9 评论 0原文

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

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

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

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

现在我的问题是:调用 dlopen() 时应该使用什么库名称?

我观察到这些内容因发行版而异。
例如,在 openSUSE 11 上,它们的命名如下:

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

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

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

因此,尝试打开“libXfixes.so”在 Ubuntu 上会失败,尽管该库显然在那里。 它只附加了一个版本号。那么我的应用程序应该如何处理这个问题?

我应该让我的应用程序首先手动扫描 /usr/lib/ 以查看我们拥有哪些库,然后选择合适的库吗?或者有人有更好的主意吗?

I'm working on a plain X11 app.

By default, my app only requires libX11.so and the standard gcc C and math libs.
The App can extend features with Xfixes, Xrender and ALSA sound system.
However, these (Xfixes, Xrender and ALSA) feature are optional.

To achieve this behavior, I am using run time loading i.e., libXfixes, libXrender and libasound shall be dlopen()ed.

Hence the App can function in absence of such libraries.

Now my question: What library names should I use when calling dlopen()?

I've observed that these differ from distro to distro.
For example, on openSUSE 11, they're named the following:

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

On Ubuntu, however, the names have a version number attached, like this:

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

So trying to open "libXfixes.so" would fail on Ubuntu, although the lib is obviously there.
It just has a version number attached. So how should my app handle this?

Should I let my app scan /usr/lib/ first manually to see which libs we have and then choose an appropriate one? Or does anyone have a better idea?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

初懵 2024-09-08 06:34:06

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

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

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

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

You should dlopen using the library's SONAME. You can see that by using readelf -d [libname].

For example, on one of my Fedora Linux machines the SONAME of the C library is libc.so.6.

The symlinks from the .so names to the .so.6 names are not guaranteed. Those symlinks are only needed for compiling software and are usually not installed on systems without the development packages.

You would not want to end up loading a version with a different number anyway, because the number changes indicate major API differences.

記柔刀 2024-09-08 06:34:06

据我所知,您只需 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”。

From what I have learned, you just dlopen() (for example) "libXfixes.so", which is most likely a symlink to the newest file "libXfixes.so.3" anyways, in a similar fashion to this one:

$ file /usr/lib/libalpm.so
/usr/lib/libalpm.so: symbolic link to `libalpm.so.4.0.3'

A quick overview of my "/usr/lib/" shows, that almost EVERY library in there is symlinked to it's newest ".X" numbered file, and I'm sure that's how it's done on other distribtuions, too.

Only if you need a specific version of the library, you explicitly name the version "libXfixes.so.2" for example.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文