库命名约定
根据Wheeler的说法,我们有real name
、soname
和linker name
:
Real name libfoo.so.1.2.3
Soname libfoo.so.1
Linker name libfoo.so
这real name
是包含实际库代码的文件的名称。soname
通常是指向 的符号链接,当real name
接口以不兼容的方式更改时,其编号会增加。最后,这linker name
是链接器在请求库时使用的,它是没有任何版本号的 soname。
因此,要首先回答您的最后一个问题,您应该在创建共享库时soname
使用, libhelloworld.so.1
, 作为链接器选项:
g++ ... -Wl,-soname,libhelloworld.so.1 ...
在本文档中,Kerrisk 提供了一个非常简短的示例,说明如何使用标准命名约定创建共享库。如果您想了解更多有关 Linux 库的信息,我认为Kerrisk和Wheeler都值得一读。
库编号约定
real name
关于图书馆中每个数字的意图和目的存在一些混淆。我个人认为Apache Portable Runtime Project很好地解释了每个数字何时应该递增的规则。
简而言之,版本号可以被认为是libfoo.MAJOR.MINOR.PATCH
.
PATCH
对于与其他版本向前和向后兼容的更改增加。
MINOR
如果库的新版本与旧版本的源代码和二进制兼容,则应递增。不同的次要版本相互向后兼容,但不一定向前兼容。
MAJOR
当引入破坏 API 的更改或与先前版本不兼容的更改时递增。
这意味着PATCH
版本可能仅在内部有所不同,例如功能的实现方式。不允许更改 API、公共函数的签名或函数参数的解释。
新MINOR
版本可能会引入新函数或常量,并弃用现有函数,但可能不会删除任何外部公开的内容。这确保了向后兼容性。换句话说,次要版本1.12.3
可用于替换任何其他1.12.x
或更早版本,例如1.11.2
或1.5.0
。不过,它并不是替代品1.16.1
,因为不同的次要版本不一定是向前兼容的。
随着新版本的发布,可以进行任何类型的更改MAJOR
;常量可能会被删除或更改,(不推荐使用的)函数可能会被删除,当然,通常会增加MINOR
or数字的任何更改(尽管将此类更改也向后移植到以前的版本PATCH
可能是值得的)。MAJOR
当然,还有一些因素会使这进一步复杂化。您可能已经开发了您的库,以便同一个文件可以同时保存多个版本,或者您可能使用. 但这是另一次讨论。:)libtool
current:revision:age