几个月前,我在debian上构建了一个使用libxml2作为共享库的C软件。 我创建了一个.deb文件来安装软件,Ubuntu用户可以让它运行。
今天,最新版本的Ubuntu有更高版本的libxml2。所以现在,软件没有运行,它要求提供以前版本的libxml2,并且使其工作的唯一方法是在链接到新版本的libxml2时构建软件。
所以我的问题是,是否可以在不需要特定版本的情况下链接到共享库(承担软件无法在某个版本上运行的风险)?
如果不是,那么如果您无法在任何Linux发行版上部署软件,那么链接共享库的真正优势是什么?
感谢您的帮助。
祝你好运, 文森特。
答案 0 :(得分:0)
大多数共享库都有嵌入式SONAME
。此SONAME
用于表示二进制兼容性。例如,libxml2.so.2.7.8嵌入了SONAME
libxml2.so.2:
readelf -Wa libxml2.so.2.7.8 | grep SONAME
0x000000000000000e (SONAME) Library soname: [libxml2.so.2]
如果libxml2.so.2.7.9出现,它可能仍然与v2.7.8二进制兼容,并且仍然有一个SONAME
的libxml2.so.2,你的应用程序就可以了。只有当引入了破坏二进制兼容性的更改时,SONAME
才会增加,从而破坏您的应用程序。
如果您想创建一个可自动处理所有发行版的软件包,一种方法是提供您自己的libxml2版本,然后修改LD_LIBRARY_PATH
以便自动加载您的版本。