c++ - 为什么有这么多符号链接(symbolic link)?

标签 c++ opencv shared-libraries

安装Opencv 2.4.9后,我发现它在/usr/local/lib中创建了很多符号链接(symbolic link)。比如说,对于 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 中,为什么还要创建一个符号链接(symbolic link)到它,甚至是另一个符号链接(symbolic link)到该符号链接(symbolic link)?

将真正的共享库放在其他地方并在/usr/local/lib 中建立指向它们的符号链接(symbolic link)会更好吗?

最佳答案

第二个 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) 指向的库。

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

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

关于c++ - 为什么有这么多符号链接(symbolic link)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28365768/

相关文章:

c++ - 在 Eclipse 中的 C++ 中链接 .lib 并在 Windows 中使用 .dll

c++ - 在c++中调用lapack和blas

c++ - 我在标准库中遇到编译错误。这是怎么回事?

opencv - 如何创建自己的高斯内核?

c++ - 使用 OpenCv 和多线程从 IP 摄像机获取实时视频

c++ - 包含其他库的 CMake add_library

Python 按位或

c++ - memchr 一个bin文件

python - 在 Raspberry Pi 上使用 Python 和 OpenCV 的低 FPS

ruby - Ruby Fiddle 中的嵌套结构