安装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
,您可以看到可执行文件没有链接到“实名”库? 原因:用于处理库升级。考虑两种情况。
- 具有向后兼容性的库升级 => 安装程序(或
ldconfig
)可以更新现有的“soname”链接(例如 libopencv_core.so.2.4)以指向更新的“实名”库(例如libopencv_core.so.2.4.10 )和我们的旧可执行文件现在将加载升级后的库。 - 没有向后兼容性的库升级 => 安装程序将创建新的“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/