安装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中创建符号链接是否更好?
答案 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
,您可以看到可执行文件未链接到"真实姓名"图书馆 ? 原因:用于处理库升级。考虑两种情况。
ldconfig
)可以更新现有的" soname"链接(例如libopencv_core.so.2.4)指向更新的"真实姓名"库(例如libopencv_core.so.2.4.10)和旧的可执行文件现在将加载升级的库。 关于,链接器的第一个符号链接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。
最后它只是帮助分配兼容性。