【问题标题】:How to do versioning of shared library?如何对共享库进行版本控制?
【发布时间】:2023-03-29 06:49:01
【问题描述】:

Windows 为应用程序和 DLL 的版本信息提供资源文件。资源文件包括版本、版权和制造商等信息。

我们有一个共享库,想添加版本信息。

我们如何在 Linux 上通过共享库做到这一点?

【问题讨论】:

    标签: linux shared-libraries


    【解决方案1】:

    Linux 使用以下策略 - 您(系统维护者)提供来自“特定”共享库文件的符号链接,如下所示:

    lrwxrwxrwx 1 root root    16 2011-09-22 14:36 libieee1284.so -> libieee1284.so.3
    lrwxrwxrwx 1 root root    20 2011-09-22 14:36 libieee1284.so.3 -> libieee1284.so.3.2.2
    -rw-r--r-- 1 root root 46576 2011-07-27 13:08 libieee1284.so.3.2.2
    

    这样,开发人员可以链接到 -lieee1284(任何版本的 ABI)或 libieee1284.so.3,甚至链接到特定的发行版和补丁版本 (3.2.2)

    【讨论】:

    • 请注意,“-lieee1284”链接到 libieee1284.so 在链接时指向的任何内容,而不是运行时。 libieee1284.so 的 soname 可能是 libieee1284.so.3 ,这就是将嵌入到可执行文件中并在运行时搜索的名称。
    【解决方案2】:

    处理此问题的最佳方法是使用 libtool,它会为您进行版本控制。

    基本上,版本信息不是(或主要不是,我不知道)在库本身中编码,而是在其文件名中。版本号通常以三点格式给出,主版本号会随着向下 ABI 兼容性的每次中断而增加,中间版本号表示向上 ABI 兼容性中断,次要版本号表示未更改 ABI 的补丁。

    就像 qdot 指出的那样,lib 目录中的符号链接提供了基本的版本控制。当前安装的开发头文件有一个没有版本号的符号链接 (libfoo.so),每个已安装的主要版本 (libfoo.so.1) 都有一个带有主号的符号链接,以及一个带有完整版本号的真实文件。通常,程序会在运行时链接到使用 libfoo.so.1,以便多个主要版本可以共存。

    【讨论】:

    • 我同意 libtool 方案似乎是最好的。您的答案在数字顺序上似乎是错误的。正确的顺序是current[:revision[:age]]。所以中间是针对补丁的,最后一个是向后兼容的程度。 libtools docs
    • 你可以在verbump.de直播-version-info C:R:A的效果。
    【解决方案3】:

    简短的版本是您通过库的soname 执行此操作。阅读第 3 章http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html 以及第 3.3 章 ABI 版本控制http://www.akkadia.org/drepper/dsohowto.pdf

    【讨论】:

    • 感谢您的回答,我是从here 重定向的,但我仍然不明白一个程序如何理解要使用哪个库版本。我希望一个程序使用一个版本,另一个使用新版本。
    • Program-Library-HOWTO 的评论:如果您在makefile 中写安装收据,除了生成文件并将其复制到目标目录之外,您什么也不做。所以不要在收据中调用 ldconfig,只需创建带有 soname 到 realname 的符号链接文件(对于您的 bin 包)并创建到 soname 的链接名(对于您的 dev-package),并且安装程序可以在“make install”之后自行调用 ldconfig 如果他们将库安装到非标准位置。因为可能会调用“make install”进行交叉编译
    猜你喜欢
    • 2010-10-20
    • 2019-05-02
    • 2011-01-28
    • 2016-09-26
    • 1970-01-01
    • 2017-03-22
    • 2010-10-01
    • 2011-10-13
    相关资源
    最近更新 更多