在我的开源项目阿尔萨中,我使用利布通知向用户显示被动桌面通知。
在运行时通过.so对共享对象( shared,dlload )文件进行查找,如果在目标机器上可用,则在它的GUI中公开通知特性,而不是静态链接libnotify。在应用程序上。首先,调用文件名为dlload的libnotify.so.1,如果它返回一个非空指针,则会公开该特性。
该模型的一个反复出现的问题是,每当遇到库的版本号时,阿尔莎的代码都需要更新,目前libnotify.so.4是最新出现的。
是否有linux系统调用(不考虑应用程序的发行版)。,它可以告诉我某个特定库的共享对象在运行时是否可用?我知道有一个残酷的选项,那就是枚举库,从1到10,我觉得这个解决方案既丑陋又不雅观。
另外,如果可以通过自来解决这个问题,那么这个解决方案也是受欢迎的--即在构建时,基于目标机器,生成的配置.h应该具有可以传递给dlload的正确的.so名称。
P.S.: --我认为好的发行版遵循创建libnotify.so.x链接的风格,这样程序员就可以执行dlload("libnotify.so", RTLD_LAZY)操作,并且加载了正确的编号为.so的版本;不幸的是,并不是所有的发行版都遵循这种方式,包括Ubuntu。
发布于 2014-07-23 09:14:07
答案是:你没有。
dlopen()并不是为了处理这样的事情而设计的,而且仅仅因为系统中有您需要的符号而试图加载系统上的任何版本并不是一个好方法。
不同的声子名有不同的ABI,不同的ABI意味着您可能正在调用相同的符号名,这意味着需要不同的参数集(或不同的大小),这将导致崩溃或错误行为,这是非常困难的调试。
您应该阅读一下共享对象版本是如何工作的和ABI是什么?。
libfoo.so链接是为链接编辑器(ld)而存在的,因此通常与-devel包一起安装;它也很可能不是一个链接,而是一个带有链接器脚本的文本文件,通常是故意的,以避免您试图做的事情。
https://stackoverflow.com/questions/12485029
复制相似问题