在类Unix系统上,动态共享库(.so文件)有SONAME
。
它可以通过以下方式提取:
readelf -a libfoo.so.0.3.2 | grep SONAME
- > libfoo.so.0
。
最后一部分也称为SOVERSION
。
该版本号标记了二进制兼容(ABI)库的版本。
因此,当程序链接到库的一个版本时,如果SOVERSION
没有更改,它也可以使用更高版本。
Libtool有一个-version-info
机制来决定SOVERSION
current
,revision
和age
这样的current
。
线索是:major = current - age
在兼容的更改中也会增加,SOVERSION
会在大多数系统上用来设置SOVERSION
。
但是,在BSD(FreeBSD,NetBSD,OpenBSD)上,current
设置为SOVERSION
,这在很多地方都有提及,例如
suse-wiki,
我也在上述平台上对此进行了测试。
问题是:为什么libtool会在BSD上执行此操作? 为什么这被认为是“BSD这样做的方式”?
这意味着Linux / Darwin / SunOS的每个兼容更改都是BSD的不兼容更改,因为{{1}}更改。
答案 0 :(得分:3)
至少有一位发布在GNU邮件列表上的开发人员认为,这可能被视为一个错误:
https://lists.gnu.org/archive/html/bug-libtool/2011-05/msg00007.html
该电子邮件还充满了对各种BSD的库版本控制策略的有用参考,这似乎与libtool的行为相矛盾