C 链接到没有版本的共享库

C 链接到没有版本的共享库,c,linker,shared-libraries,shared,C,Linker,Shared Libraries,Shared,几个月前,我在debian上构建了一个使用libxml2作为共享库的C软件。 我为安装软件创建了一个.deb文件,Ubuntu用户可以让它运行 今天,最新版本的Ubuntu拥有更高版本的libxml2。所以现在,该软件无法运行,它要求使用以前版本的libxml2,而使其工作的唯一方法是在链接新版本libxml2的同时构建该软件 所以我的问题是,是否可以在不需要特定版本的情况下链接共享库(冒软件无法在某些版本上工作的风险) 如果不是,那么如果您不能在任何Linux发行版上部署软件,那么与共享库链接

几个月前,我在debian上构建了一个使用libxml2作为共享库的C软件。 我为安装软件创建了一个.deb文件,Ubuntu用户可以让它运行

今天,最新版本的Ubuntu拥有更高版本的libxml2。所以现在,该软件无法运行,它要求使用以前版本的libxml2,而使其工作的唯一方法是在链接新版本libxml2的同时构建该软件

所以我的问题是,是否可以在不需要特定版本的情况下链接共享库(冒软件无法在某些版本上工作的风险)

如果不是,那么如果您不能在任何Linux发行版上部署软件,那么与共享库链接的真正优势是什么

谢谢你的帮助

致以最良好的祝愿,
Vincent.

大多数共享库都会有一个嵌入式的
SONAME
。此
SONAME
用于指示二进制兼容性。例如,libxml2.so.2.7.8中嵌入了libxml2.so.2的
SONAME

readelf -Wa libxml2.so.2.7.8 | grep SONAME
0x000000000000000e (SONAME)             Library soname: [libxml2.so.2]
如果libxml2.so.2.7.9问世,它很可能仍然与v2.7.8兼容,并且仍然具有libxml2.so.2的
SONAME
,并且您的应用程序可以正常工作。只有当引入了破坏二进制兼容性的更改时,
SONAME
才会增加,从而破坏您的应用程序


如果您想创建一个能够自动在所有发行版上工作的包,一种方法是交付您自己的libxml2版本,然后修改
LD_LIBRARY\u路径,以便自动加载您的版本。

“每个共享库都有一个嵌入式
SONAME
”——这句话是错误的。拥有
SONAME
是一种很好的做法,但这绝不是必需的。这并不能回答“是否可以在不需要特定版本的情况下链接到共享库?”的问题。如前所述,下面的(已接受的)答案并不能回答该问题。我假设根本问题是:如何覆盖二进制文件中记录的SONAME,使其不包含一个大数——“libxml2.so”而不是“libxml2.so.2”。我不知道它是否有效,因为图书馆有一个主打号码的奏鸣曲。。。