加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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

发布时间:2020-12-14 01:39:20 所属栏目:Linux 来源:网络整理
导读:我正在开发一款普通的X11应用程序. 默认情况下,我的应用程序只需要libX11.so和标准的gcc C和数学库. 该应用程序可以扩展功能与Xfixes,Xrender和ALSA音响系统. 但是,这些(Xfixes,Xrender和ALSA)功能是可选的. 为了实现这个行为,我使用运行时加载,即libXrenes,
我正在开发一款普通的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()?

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

> libXfixes.so
> libXrender.so
> libasound.so

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

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

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

多谢你们,

安迪

解决方法

你应该使用图书馆的SONAME.你可以通过使用readelf -d [libname]来看到它.

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

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

您不希望最终加载具有不同数字的版本,因为数字更改表明主要的API差异.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读