我使用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指令中的主要版本?如果没有,定义主要/次要号码的首选方式是什么?
使用库进行版本控制非常复杂.MAJOR.MINOR.MICRO版本控制系统可能适用于某些软件包,但有一些缺点.
MICRO修订版块意味着库具有内部更改 - 通常是错误修复 - 但对接口不透明.理想情况下,共享库应该是二进制兼容的.MINOR修订版可能会添加功能,但不应破坏任何现有API.MAJOR修订版可能会破坏API,需要更改应用程序代码.
该libtool的版本控制系统,描述了一个更全面的方法,对于提供的规则current:revision:age
,你可以传递给描述libfoo_la_LDFLAGS -version-info
.还有另一种选择:libfoo_la_LDFLAGS = -release-info
.该系统描述了兼容的库范围的"范围".
我建议看一下使用'复杂'版本控制的成熟软件包的文件configure.ac
和Makefile.am
文件,比如GTK +,GLib库; 并决定是否需要投资这种复杂性.
Ulrich Drepper 有一些相当技术性的论文描述了最终的ABI版本.这些可能与系统libc(glibc)开发人员更相关,在这些关键库中维护符号版本信息,以及ELF ABI支持等.我将坚持查看维护良好的基础架构包,并提供良好的autotools支持. ..
在AC_INIT
"版本"真的是指由维护者包发行版本,并没有任何与库版本.该MAJOR.MINOR.MICRO
不是对源代码分发一个坏主意,因为它描述了释放的年代了.