br />
我理解这个想法是拥有两个不同的文件,以便系统上可以存在两个版本的库(与Windows上的“ DLL Hell”相对)。我想知道这在实际中如何运作?通常,我看到
example.so.1
实际上是指向example.so.2
的符号链接,其中example.so
是最新版本。那么,依赖旧版本example.so.2
的应用程序如何正确识别它?关于必须使用什么数字有任何规定吗?还是这仅仅是约定?是否不同于Windows在系统之间传输软件二进制文件的情况下,如果系统具有共享对象的较新版本,则从源代码进行编译时会自动链接到较旧版本?我怀疑这与
.2
有关,但我不确定如何。#1 楼
二进制文件本身知道它们所依赖的共享库的版本,并特别要求它。您可以使用ldd
来显示依赖性。 ls
的地雷为:$ ldd /bin/ls
linux-gate.so.1 => (0xb784e000)
librt.so.1 => /lib/librt.so.1 (0xb782c000)
libacl.so.1 => /lib/libacl.so.1 (0xb7824000)
libc.so.6 => /lib/libc.so.6 (0xb76dc000)
libpthread.so.0 => /lib/libpthread.so.0 (0xb76c3000)
/lib/ld-linux.so.2 (0xb784f000)
libattr.so.1 => /lib/libattr.so.1 (0xb76bd000)
如您所见,它指向例如
libpthread.so.0
,而不仅仅是libpthread.so
。符号链接的原因是链接程序。当您要直接链接到
libpthread.so
时,请给gcc
标志-lpthread
,它会自动添加lib
前缀和.so
后缀。您不能告诉它在.so.0
后缀上添加,因此符号链接指向lib的最新版本以简化该操作#2 楼
共享库中的数字是Linux中的惯例,用于标识库的API。通常,格式为:libFOO.so.MAJOR.MINOR
您通常注意到,从libFOO.so到libFOO.so.MAJOR.MINOR有一个符号链接。 ldconfig负责将此链接更新为最新版本。
当API更改(删除了新的入口点或更改了参数或类型)时,MAJOR通常会增加。对于错误修复版本或在不破坏现有API的情况下引入新API的情况下,MINOR通常会增加。
评论
嗨,米格尔(Miguel),谢谢您,可惜我不能接受两个答案,因为这很好地补充了上述内容。向我+1,链接也很棒,再次感谢!
–user119
2010年8月15日14:22
几乎是正确的,但实际上是libFOO.so.MAJOR.MINOR(因此不在末尾)
–JonnyJD
13年4月4日在17:34
这个答案太错了。首先,您看到的数字与API无关,它们纯粹是ABI。其次,这里的约定不是像您回答的建议那样的语义版本控制。相反,它是一个libtool约定,具有映射到ld.so可以比较的单个库版本号的不错的属性(有关更多信息,请参见gnu.org/software/libtool/manual/html_node/…)
– NewbiZ
18年8月15日在9:06
#3 楼
共享库应按照以下方案进行版本控制:blah.so.X.Y.Z
其中
X =向后不兼容的ABI版本> Y =向后兼容的ABI版本
Z =仅内部更改-没有更改ABI
通常,您只看到第一个数字,例如
hello.so.1
,因为第一个数字是唯一需要标识的内容库的“版本”,因为所有其他数字都是向后兼容的。您可以通过运行以下命令进行验证:ldconfig -p
当为Red Hat之类的程序构建软件包时,将查找并添加以二进制形式调用的共享库作为RPM构建时软件包的依赖项。因此,当您去安装软件包时,安装程序将通过检查
ldconfig
来检查是否在系统上安装了hello.so.1
。 您可以通过执行以下操作来查看软件包的依赖关系:
ldconfig
可以安装在系统上并同时由不同的应用程序使用。评论
我认为这是最好的答案。
–周克敏
17年11月19日在1:04
共享库应根据以下方案进行版本控制(…)–请您提供此声明的参考?
–彼得·多布罗格斯特(Piotr Dobrogost)
19 Mar 19 '19在15:15
评论
等号“ = ls”不应出现。只需使用“ ldd ls”
– bmacnaughton
17年9月6日在21:05
@bmacnaughton这可能会给您一个错误,因为ldd需要可执行文件的完整路径。 = ls在zsh中做到了,但是我更改了它,因为不是每个人都使用该shell
– Michael Mrozek
17年9月6日在21:54
有趣。我在Ubuntu上运行bash,但似乎没有完整的路径就可以工作。感谢您的解释-我不使用zsh。
– bmacnaughton
17年9月6日在22:40
“因此,符号链接指向lib的最新版本以方便使用”。符号链接的原因是指向与系统上已安装的标头匹配的.so.X文件。不要指向最新版本的.so.X文件。它通常是最新的,但是在很多情况下它并不是最新的(特别是在开发过程中。除此之外,符号链接也毫无用处)。
– Johannes Schaub-小人
19年11月12日17:59
“您不能告诉它添加.so.0后缀。” <-实际上,您可以告诉它您想要某个版本的库;看到这个答案。
– einpoklum
20年7月21日在8:19