为什么会有这么多的符号链接?

wki*_*ing 2 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
...
Run Code Online (Sandbox Code Playgroud)

我的问题是,由于它已经将真正的共享库libopencv_core.so.2.4.9放在/ usr / lcoal / lib中,为什么还要麻烦地创建指向它的符号链接,甚至是创建指向该符号链接的符号链接?

将真正的共享库放在其他位置并在/ usr / local / lib中建立到它们的符号链接是否更好?

Kir*_*ran 5

第二个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”链接(例如libopencv_core.so.3.0)以指向新的“ realname”库(例如libopencv_world.so.3.0.0)。之后在这里构建的程序可以链接到较新的库,而较旧的程序将继续加载较旧的soname(libopencv_core.so.2.4)指向的库。

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

更好的解释在这里(1)。