soname用于指示您的库支持哪些二进制api兼容性。
链接器在编译时使用NEEDED从库文件确定实际的目标库版本。 gcc -lSONAME将寻找libNAME.so链接或文件,然后捕获其SONAME,它肯定会更加具体(例如libnuke.so链接到包含SONAME libnuke.so.0的libnuke.so.0.1.4)。
在运行时,它将与其链接,然后将其设置为ELF动态节NEEDED,然后应存在具有该名称的库(或指向该库的链接)。在运行时将忽略SONAME,因此仅链接或文件存在就足够了。
备注:SONAME仅在链接/构建时强制执行,而不在运行时强制执行。
库的“ SONAME”可以与“ objdump -p文件| grep SONAME”一起看到。二进制文件“ NEEDED”可以通过“ objdump -p文件| grep NEEDED”看到。
[编辑]警告以下是一般性说明,而不是Linux中部署的说明。 参见最后。
假设您有一个名称为libnuke.so.1.2的库,并开发了一个新的libnuke库:
如果您的新库是以前的修复程序,且未更改api,则应保持相同的名称,增加文件名的版本。 即文件将是libnuke.so.1.2.1,但是soname仍然是libnuke.so.1.2。
如果您有一个仅添加了新功能但没有中断功能并且仍与先前兼容的新库,则您希望使用与先前相同的soname以及一个新的后缀.1.。 即文件和soname将是libnuke.so.1.2.1。 与libnuke.1.2链接的任何程序仍然可以使用该程序。 与libnuke.1.2.1链接的新程序只能与该程序一起使用(直到新的Subversion像libnuke.1.2.1.1一样)。
如果您的新库与任何libnuke不兼容:libnuke.so.2
如果您的新库与旧版本兼容:libnuke.so.1.3 [即仍与libnuke.so.1兼容]
[编辑]完成:Linux情况。
在Linux现实生活中,SONAME作为一种特定形式:lib [NAME] [API-VERSION] .so。[主要版本]major-version只是每个主要库更改时增加的一个整数值。API-VERSION默认为空
前libnuke.so.0
然后,实际文件名包括次要版本和子版本,例如:libnuke.so.0.1.5
我认为不提供soname是一个坏习惯,因为重命名文件会改变其行为。