【问题标题】:How to control shared library version issue on Linux?如何控制 Linux 上的共享库版本问题?
【发布时间】:2012-06-02 22:25:47
【问题描述】:

例如,我创建了一个名为 libXXX.so.0.0.0 的共享库,soname 为 libXXX.so.0。那么,我是否需要创建一个名为 libXXX.so.0 的符号链接并让它指向真正的共享库?还是我只需要创建一个名为 libXXX.so 的符号链接?

此外,如果我将库更新为 libXXX.so.0.0.1 会怎样?

  1. 如果我在系统库路径上安装共享库,比如 /lib/usr/lib,如何更新符号链接?使用 ldconfig

  2. 如果我在当前本地文件夹中安装共享库,如何 更新符号链接?

顺便说一句,如何控制 Makefile 中的版本问题?我的意思是我是否需要添加一些命令,例如 ln -sldconfig

【问题讨论】:

    标签: shared-libraries


    【解决方案1】:

    是的,创建一个名为 libXXX.so.0 的符号链接,指向 libXXX.so.0.0.0

    如果您希望人们能够构建链接到此库的程序,那么还要创建一个名为 libXXX.so 的符号链接,指向 libXXX.so.0

    程序加载器将使用 libXXX.so.0 符号链接,因为这是程序将要查找的 soname。

    链接器在构建程序时将使用libXXX.so 符号链接,因为按照历史惯例,链接器就是这样工作的。

    另外,如果我将库更新为 libXXX.so.0.0.1 会怎样?

    然后您重新制作libXXX.so.0 符号链接,使其指向libXXX.so.0.0.1。没有其他东西需要改变。由于libXXX.so 符号链接指向libXXX.so.0,它也会自动指向新库。

    如何更新符号链接?

    如果您使用某些打包系统(RPM,...)安装新库,则使用打包系统提供的任何功能来管理符号链接。如果您只是使用脚本或 Makefile 节,那么只需 rm -f 旧符号链接和 ln -s 新符号链接。

    【讨论】:

    • 非常感谢您的好评!顺便说一句,ldconfig 命令如何以及何时起作用?
    • ldconfig 管理 soname-to-pathname 转换的缓存。 (运行 ldconfig -p 来查看这些项目。)它不知道也不关心这些路径名真正指向的微版本文件。此缓存可以减少程序启动时查找库所需的时间,因为加载器不再需要遍历默认库目录列表来查找名称与程序所需的 soname 匹配的文件。
    • 我不完全理解@ottomeister 的评论。 ldconfig 使缓存在启动时更快地链接程序。还行吧。但是,ldconfig 是否也寻找新版本的库?例如。我应该在安装新库版本时手动处理符号链接,还是 ldconfig 会自动为我处理?我也相信我在手册中找到了答案:ldconfig creates the necessary links and cache to the most recent shared libraries found,但你能确认我没有看错吗?
    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 2011-01-28
    • 2018-10-07
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 1970-01-01
    相关资源
    最近更新 更多