版本号,次要编号和版本号之间的差异

时间:2013-03-16 20:43:37

标签: c++ c linux shared-libraries

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

版本,次要和发行号码有什么区别?部件的意思是“只要界面发生变化,版本号就会增加”?

  

soname具有前缀lib,库的名称,短语.so,后跟句点和版本号,只要界面发生变化,该版本号就会递增。

     

真实姓名为soname添加了句号,次要号码,其他句号和发行号码。

1 个答案:

答案 0 :(得分:7)

每次发布​​库时,都应该有不同的版本号。但是,某些版本只会更改库的内部工作方式而不会影响用户,只需修复错误。其他版本也可能向库中添加新功能,但所有现有功能的接口详细信息与之前相同,因此编写为使用旧版本库的软件将继续使用新版本。其他更改可能会破坏向后兼容性;一个函数接口改变,一个结构改变大小,或一个函数被删除(或一个全局变量 - 消除思想 - 改变等)。

该错误只能修复'版本可能不会因重新编号库而烦恼,但如果您之前有liberror.so.1.0.2,则新版本可能是liberror.so.1.0.3,即版本号的更改。

&#39>其他功能'版本应该被赋予一个新的次要编号,因此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.3liberror-1.1.0而不会出现问题,但不会尝试使用liberror.so.2.0.0或更高版本。


  

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

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

您可能已经注意到有“开发”和“开发”。图书馆的软件包以及标准版#39;库的版本。它们之间的区别是解释的一部分。

如果您是一名普通的最终用户,他不使用库编写程序,而只是运行其他人编写的程序,那么您通常最终会在安装目录中找到一个文件和一个符号链接。继续假设的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或更晚(但不是{{1}或更晚)。

现在让我们假设您将安装升级到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链接是一个坏主意,因为您确定的一件事是界面不同!


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

liberror.so.1

您可以看到$ 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.solibclibcaplibcidnlibcom_errlibcrypt