【问题标题】:How to define shared library major version in autoconf?如何在 autoconf 中定义共享库主版本?
【发布时间】:2013-12-03 11:28:18
【问题描述】:

我使用 autoconf/automake/libtool 来构建一个共享库。我想将库版本的主要编号传递给共享库 soname。

我在 configure.ac 中有以下声明:

AC_INIT([libabc], [1.1.0])

还有下面的 Makefile.am:

AM_CPPFLAGS              = -I$(top_srcdir)/include -Wall -Wextra
LDADD                    = libabc.la

lib_LTLIBRARIES          = libabc.la
nodist_libabc_la_SOURCES = $(top_srcdir)/config.h
libabc_la_SOURCES        = $(top_srcdir)/src/abc.c

我可以为配置脚本、源和共享库 soname 使用相同的版本。我可以在源代码中使用自动生成的 config.h 中定义的 VERSION 或 PACKAGE_VERSION,但这不会影响 soname,它始终是 libabc.so.0。

有没有办法强制 libtool 使用我来自 AC_INIT 指令的主要版本?如果不是,定义主要/次要数字的首选方法是什么?

【问题讨论】:

    标签: shared-libraries autotools libtool


    【解决方案1】:

    版本控制对于库来说是相当复杂的。 MAJOR.MINOR.MICRO 版本控制系统可能适用于某些软件包,但有一些缺点。

    一个 MICRO 修订凹凸意味着该库有 内部 更改 - 通常是错误修复 - 但对界面不透明。理想情况下,共享库应该是二进制兼容的。次要修订可能会增加功能,但不应破坏任何现有 API。重大修订可能会破坏 API,需要更改应用程序代码。

    libtool versioning system 描述了一种更全面的方法,为您可以传递给libfoo_la_LDFLAGS -version-infocurrent:revision:age 描述提供规则。还有一个替代方案:libfoo_la_LDFLAGS = -release-info。该系统描述了一系列兼容的库修订。

    我建议查看使用“复杂”版本控制的成熟软件包的configure.acMakefile.am 文件,例如GTK+, GLib 库;并决定是否需要投资于这种复杂性。


    Ulrich Drepper 的一些相当技术性的 papers 描述了 ABI 版本控制。这些可能与系统 libc (glibc) 开发人员更相关,在这些关键库中维护符号版本信息,以及 ELF ABI 支持等。我会坚持查看具有良好自动工具支持的维护良好的基础设施包。 ..


    AC_INIT 'version' 真正指的是维护者发布的包版本,与库版本无关。 MAJOR.MINOR.MICRO 对于源代码分发来说并不是一个坏主意,因为它也描述了发布的时间顺序。

    【讨论】:

    • 感谢您的回答。假设我有 ABI 维护的基本知识,即使在开发库时我没有密切关注它。另外,我可以假设 AC_INIT 'version' 与库 ABI 版本完全相同。另外,我想坚持 abc.so.X.Y 命名风格而不是 abc-X.Y.so,尽管这是有问题的。所以这个问题是相当技术性的——我应该在 configure.ac 和 Makefile.am 中写什么来将版本传递给以简单方式生成的 SONAME。您是否建议使用 GTK 中的 LT_VERSION_INFO 技巧作为参考设计?
    【解决方案2】:

    将其设置为零比分配每次更改的x.y.z 修订版更糟糕。虽然不是很理想,但x.y.z 会在很多情况下防止版本冲突。

    使用-Wl,-soname,libXXX.so.1.0 链接器参数。

    【讨论】:

      【解决方案3】:

      来自https://phab.enlightenment.org/w/autotoolsintegration/

      m4_define([v_maj], [1])
      m4_define([v_min], [1])
      m4_define([v_mic], [0])
      m4_define([lt_cur], m4_eval(v_maj + v_min))
      m4_define([project_version], [v_maj.v_min.v_mic])
      
      m4_define([lt_cur], [m4_eval([v_maj] + [v_min])])
      m4_define([lt_rev], [v_mic])
      m4_define([lt_age], [v_min])
      version_info="lt_cur:lt_rev:lt_age"
      AC_SUBST([version_info])
      
      AC_INIT([my_project], [project_version], [enlightenment-devel@lists.sourceforge.net])
      

      而 src/lib/Makefile.am 是:

      MAINTAINERCLEANFILES = Makefile.in
       
      include_HEADERS = Foo.h
       
      lib_LTLIBRARIES = libfoo.la
       
      libfoo_la_SOURCES  = foo1.c foo2.c
      libfoo_la_LDFLAGS = -version-info @version_info@
      

      注意 (2021.09.19):m4_eval 已修复
      注(2021.09.20):添加 AC_INIT

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        • 2018-10-07
        • 2011-09-02
        相关资源
        最近更新 更多