【发布时间】:2008-10-03 16:10:35
【问题描述】:
假设我已将库 foo.so.1.1.1 添加到包含在 /etc/ld.so.conf 中的路径中
当我在系统上运行 ldconfig 时,我得到链接 foo.so.1.1 和 foo.so.1 到 foo.so.1.1.1
如何更改行为以同时获取指向 foo.so.1.1.1 的 foo.so 链接?
【问题讨论】:
标签: linux
假设我已将库 foo.so.1.1.1 添加到包含在 /etc/ld.so.conf 中的路径中
当我在系统上运行 ldconfig 时,我得到链接 foo.so.1.1 和 foo.so.1 到 foo.so.1.1.1
如何更改行为以同时获取指向 foo.so.1.1.1 的 foo.so 链接?
【问题讨论】:
标签: linux
ldconfig 查看它找到的所有共享对象,以查找 soname。然后,它使用该 soname 作为链接名称创建一个链接。 soname 是库的名称和主要版本是常规的(但远非普遍使用),因此您的库 foo.so.1.1 将具有 foo.so.1 的 soname 并且 ldconfig 将创建一个名为该链接的链接。
运行时系统的任何部分都不会查找或知道关于名称 foo.so 的任何信息。当您将程序链接到库时使用它。除非您还拥有该库的所有其他开发文件(头文件等),否则拥有该链接是没有意义的,因此 ldconfig 自动创建它是没有意义的。而且由于要使用的链接名称只是另一种约定,在这种情况下根本不存储在文件中,因此 ldconfig 无法知道要创建什么名称。
通常这将在 Makefile 的安装目标中手动创建;当为 linux 发行版打包库时,链接通常与头文件一起存在于 -dev 包中。
【讨论】:
只需自己制作符号链接:
ln -s /usr/lib/foo.so.1.1.1 /usr/lib/foo.so
请注意,对于以这种方式使用库的应用程序,它们需要显式链接到未版本化的共享对象。 IE:这是一种完全绕过动态加载器版本匹配系统的机制。
【讨论】: