在我的开源项目Artha中,我使用libnotify向用户显示被动桌面通知。
不是静态链接 libnotify,而是在运行时通过 查找共享对象 (.so) 文件dlload
,如果在目标机器上可用,Artha 在其 GUI 中公开通知功能。在应用程序上。开始,dlload
使用文件名参数 aslibnotify.so.1
进行调用,如果它返回一个非空指针,则该功能被公开。
这个模型的一个反复出现的问题是,每次库的版本号被碰撞时,Artha 的代码都需要更新,目前libnotify.so.4
是最新的出现这种情况的代码。
是否有 linux 系统调用(无论应用程序在哪个发行版上运行),它可以告诉我特定库的共享对象在运行时是否可用?我知道存在通过从 1 到 10 来枚举库的蛮力选项,我发现解决方案丑陋且不雅。
此外,如果这可以通过autoconf解决,那么该解决方案也很受欢迎,即在构建时,基于目标机器,生成的 configure.h 应该具有可以传递给 .so 的正确名称dlload
。
PS:我认为好的发行版遵循创建链接的风格,libnotify.so.x
以便程序员可以做dlload("libnotify.so", RTLD_LAZY)
并且加载正确的版本号 .so ;不幸的是,并非所有发行版都遵循这一点,包括 Ubuntu。