为什么这么多象征性的链接?

时间:2015-02-06 12:24:02

标签: c++ opencv shared-libraries

安装Opencv 2.4.9后,我发现它在/ usr / local / lib中创建了许多符号链接。比方说,对于libopencv_core.so.2.4.9,当我使用ls -l时,显示

...
libopencv_core.so -> libopencv_core.so.2.4
libopencv_core.so.2.4 -> libopencv_core.so.2.4.9
libopencv_core.so.2.4.9
...

我的问题是,既然它已经将真正的共享库libopencv_core.so.2.4.9放在/ usr / lcoal / lib中,为什么还要创建一个符号链接,甚至是另一个符号链接?

将真正的共享库放在其他地方并在/ usr / local / lib中创建符号链接是否更好?

2 个答案:

答案 0 :(得分:4)

第二个libopencv_core.so.2.4(别名" soname")和第三个libopencv_core.so.2.4.9(别名"真实姓名")文件是允许你的文件更新库(在本例中为OpenCV),并且仍然支持想要使用这些库的旧版本的程序。

  

$ ldd a.out
  libopencv_core.so.2.4 => /path/to/lib/libopencv_core.so.2.4

运行ldd,您可以看到可执行文件未链接到"真实姓名"图书馆 ? 原因:用于处理库升级。考虑两种情况。

  1. 具有向后兼容性的库升级=>安装程序(或ldconfig)可以更新现有的" soname"链接(例如libopencv_core.so.2.4)指向更新的"真实姓名"库(例如libopencv_core.so.2.4.10)和旧的可执行文件现在将加载升级的库。
  2. 没有向后兼容性的库升级=>安装程序将创建新的" soname" link(例如libopencv_core.so.3.0)指向new" realname"库(例如libopencv_world.so.3.0.0)。之后构建的程序可以链接到较新的库,而较旧的程序将继续加载较旧的soname指向的库(libopencv_core.so.2.4)。
  3. 关于,链接器的第一个符号链接libopencv_core.so(别名"链接器名称")。对于-lopencv_core之类的标记,gcc前缀为lib,并将.so后缀为库名称并进行搜索。所以它期望一个名为libopencv_core.so的文件,因此需要第一个符号链接。它从未在程序运行时使用。此外,如果愿意给予" soname"链接为gcc命令行参数而不是-lopencv_core,您将永远不需要此软链接。

    这里更好地解释(1)。

答案 1 :(得分:3)

这是Linux系统上一个非常常用的过程,因为它允许您更改.so的最新版本(在您的情况下为.so.2.4.9),而运行的应用程序只知道需要与第一个版本链接。所以。

所以所有程序都加载第一个.so然后通过符号链接加载当前安装的版本。

如果它像你提议的那样(只是复制硬盘.so),那么所有程序都会抱怨他们找不到合适的版本(在你的情况下是2.4.9)。也许在将来你将openCV升级到2.4.10,你的所有程序都将停止工作。

某些项目实际上强制链接到某些主要或中等版本。因此,例如,如果您只保证您的程序适用于2.4版本,则将其链接到.so.2.4而不是.so。

最后它只是帮助分配兼容性。