2015-02-06 70 views
1

安装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中为它们创建符号链接会更好吗?

+1

搜索条件:“soname” – Angew 2015-02-06 12:40:48

+0

如果您安装了多个版本并使用需要不同版本的应用程序,这会更加明显。 – molbdnilo 2015-02-06 12:59:54

回答

0

第二个libopencv_core.so.2.4(alias“soname”)和第三个libopencv_core.so.2.4.9(alias“real name”)文件是允许您更新库(在这种情况下为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”链接(例如libopencv_core.so.3.0)以指向新的“realname”库(例如libopencv_world.so.3.0.0)。此处构建的程序可能会链接到较新的库,而较旧的程序将继续加载较旧的soname指向的库(libopencv_core.so.2.4)。

关于,libopencv_core.so(别名“链接名称”)的第一个符号链接是为连接器。对于像-lopencv_core这样的标志,gcc前缀lib并将后缀.so添加到库名称和搜索中。所以它期望一个名为libopencv_core.so的文件,因此需要第一个符号链接。它在程序运行期间从不使用。另外,如果愿意将“soname”链接作为gcc命令行参数而不是-lopencv_core,则永远不需要此软链接。

这里更好地解释(1)。

3

这是一个在Linux系统上很常用的程序,因为它允许你改变最后版本的.so(在你的情况下为.so.2.4.9),而只运行的应用程序知道他们需要链接第一个.so。

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

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

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

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