版本号、次要版本号和发行版号之间的区别

问题描述 投票:0回答:1

我正在阅读 http://www.tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html 我有一些问题。

版本号、次要版本号和发行号之间有什么区别? “只要接口改变,版本号就会增加”这部分是什么意思?

soname 具有前缀

lib
、库名称、短语
.so
,后跟句点和版本号,每当界面更改时版本号就会递增。

真实姓名会在 soname 中添加一个句点、一个次要编号、另一个句点和发行号。

c++ c linux shared-libraries
1个回答
9
投票

每次发布库时,它应该有不同的版本号。 然而,某些版本仅对库的内部工作方式进行更改,除了修复错误之外根本不会影响用户。 其他版本也可能向库中添加新函数,但所有现有函数的接口细节与以前相同,因此使用旧版本库编写的软件将继续与新版本一起使用。 其他更改可能会破坏向后兼容性;函数接口发生变化,结构大小发生变化,或者函数被删除(或者全局变量 - 消除想法 - 发生变化,等等)。

“仅修复错误”版本可能不会为库重新编号而烦恼,但如果您以前有

liberror.so.1.0.2
,新版本可能是
liberror.so.1.0.3
,版本号发生了变化。

“附加功能”版本应指定新的次要编号,因此

liberror.so.1.0.2
之后的新版本可能是
liberror.so.1.1.0

如果破坏兼容性,则使用新版本号,因此

liberror.so.1.0.2
之后的新版本可能是
liberror.so.2.0.0

使用

liberror.so.1.0.2
构建的代码可以并且将会毫无问题地使用
liberror.so.1.0.3
liberror-1.1.0
,但不会尝试使用
liberror.so.2.0.0
或更高版本。


什么代码(例如,在 GNU binutils 堆栈中)控制将链接到哪些版本,这种行为是固定的还是可覆盖的?

好问题。 这是我的理解,但我可能会有一些细节错误(在这种情况下,可能会有人指出我的方法的错误)。 上面的理论很好而且很简单;这有点不太容易。

您可能已经注意到,有库的“开发”包以及库的“标准”版本。 它们之间的差异是解释的一部分。

如果您是一名普通最终用户,不使用库编写程序,而只是运行其他人编写的程序,那么您通常会在安装目录中得到一个文件和一个符号链接。 继续假设的

liberror.so.1.0.2
示例(安装在
/usr/local/lib
中),您会在基础版本中找到:

    liberror.so.1.0.2   — the real shared object
    liberror.so.1       — symlink to the the real shared object

如果您安装了开发版本,您可能会在

/usr/local/include
中找到一些头文件,一些手册页(可能在
/usr/local/man
中,也许在
/usr/share
中),以及一个额外的符号链接:

    liberror.so         — another symlink, either to liberror.so.1 or to liberror.so.1.0.2

当使用它的程序被编译时,你可以指定:

gcc -I/usr/local/include usererror.c -o usererror -L/usr/local/lib -lerror

这将与名称

liberror.so
链接,但从
liberror.so.1.0.2
文件中读取元数据,它会知道要使用的版本是
liberror.so.1.0.2
或更高版本(但不是
liberror.so.2.0.0
或更高版本)。

现在假设您将安装升级到

liberror.so.2.0.0
。 您现在拥有文件:

liberror.so.1.0.2   — the real shared object
liberror.so.1       — symlink to the the real shared object
liberror.so.2.0.0   — the real shared object
liberror.so.2       — symlink to the the real shared object
liberror.so         — another symlink, either to liberror.so.2 or to liberror.so.2.0.0

使用

liberror.so.1
构建的旧代码仍然使用该库运行。 使用
liberror.so.2
构建的新代码也可以使用新库运行。 在链接时,新程序通过符号链接
liberror.so.2.0.0
获取
liberror.so

您可以通过调整

liberror.so.1
符号链接以指向
liberror.so
来控制它,以便系统上的默认值仍然是
liberror.so.1.0.2
。 唯一棘手的部分是确保正确版本的标头可用于编译。 使用
liberror.so.2
的标头构建并与
liberror.so.1
链接是一个坏主意,因为您确定的一件事是接口是不同的!


来自 Red Hat Enterprise Linux 5 (RHEL5) x86_64 计算机的一些原始数据。

$ cd /lib64
$ ls libc*
-rwxr-xr-x 1 root root 1713088 2009-01-05 16:32 libc-2.5.so
lrwxrwxrwx 1 root root      11 2012-02-22 15:05 libcap.so -> libcap.so.1
lrwxrwxrwx 1 root root      14 2012-02-22 15:05 libcap.so.1 -> libcap.so.1.10
-rwxr-xr-x 1 root root   17384 2006-11-14 01:36 libcap.so.1.10
-rwxr-xr-x 1 root root  197744 2009-01-05 16:32 libcidn-2.5.so
lrwxrwxrwx 1 root root      14 2012-02-22 15:05 libcidn.so.1 -> libcidn-2.5.so
lrwxrwxrwx 1 root root      17 2012-02-22 15:05 libcom_err.so.2 -> libcom_err.so.2.1
-rwxr-xr-x 1 root root   10000 2008-09-30 13:27 libcom_err.so.2.1
-rwxr-xr-x 1 root root   48600 2009-01-05 16:32 libcrypt-2.5.so
-rwxr-xr-x 1 root root 1048728 2005-10-31 06:47 libcrypto.so.0.9.6b
-rwxr-xr-x 1 root root 1365504 2008-12-16 08:09 libcrypto.so.0.9.8e
lrwxrwxrwx 1 root root      19 2012-02-22 15:05 libcrypto.so.2 -> libcrypto.so.0.9.6b
lrwxrwxrwx 1 root root      19 2012-02-22 15:05 libcrypto.so.4 -> libcrypto.so.0.9.8e
lrwxrwxrwx 1 root root      19 2012-02-22 15:05 libcrypto.so.6 -> libcrypto.so.0.9.8e
lrwxrwxrwx 1 root root      15 2012-02-22 15:05 libcrypt.so.1 -> libcrypt-2.5.so
lrwxrwxrwx 1 root root      11 2012-02-22 15:05 libc.so.6 -> libc-2.5.so
$

您可以看到

libc.so.6
libc-2.5.so
的符号链接。 您还可以使用多个版本的
libcrypto
,不包括链接时库
libcrypto.so
。 您还可以看到版本号只有两部分的库等。代表的库是
libc
libcap
libcidn
libcom_err
libcrypt
libcrypto

另请参阅:语义版本控制 2.0.0

© www.soinside.com 2019 - 2024. All rights reserved.