使用Autoconf构建Linux .so文件时版本号生成错误
解决Autoconf生成共享库版本号不符的问题
核心问题
你错误地将语义化版本号(0.1.0)的主、次、补丁部分直接映射到Libtool的-version-info参数上,而Libtool的current:revision:age三个参数有独立的语义规则,并非和语义版本一一对应。
Libtool -version-info 参数说明
Libtool用-version-info current:revision:age来控制共享库版本,三个参数的含义:
- current:当前库的接口版本编号,当库的接口发生不兼容变更时递增
- revision:同一接口版本下的修订次数,仅修改bug不改动接口时递增
- age:当前版本兼容的旧接口版本数量,即比current小age的所有版本都能和当前版本兼容
生成的共享库文件名格式为libname.so.major.minor.patch,对应计算规则:
major = current - age minor = age patch = revision
你的问题分析
你当前设置LT_VERSION="$CURRENT:$REVISION:$AGE",其中CURRENT=0、REVISION=1、AGE=0,代入规则计算:
- major = 0 - 0 = 0
- minor = 0
- patch = 1
最终得到libWebLoom.so.0.0.1,和预期不符。
修复方案
要得到预期的libWebLoom.so.0.1.0,需要满足:
- major = 0
- minor = 1
- patch = 0
结合计算规则反推:
- minor = age → age = 1
- major = current - age → current = 0 + 1 = 1
- patch = revision → revision = 0
因此LT_VERSION应设置为1:0:1。
同时,你的configure.ac中有一处语法错误:AC_SUBST(VERSION_PATCH, [$AGE]),末尾多了个逗号,需删除。
修改后的configure.ac相关部分:
AC_INIT([WebLoom], [0.1.0], [WebLoom@invalid.invalid]) AC_CONFIG_MACRO_DIRS([m4]) AM_INIT_AUTOMAKE([foreign subdir-objects]) LT_INIT AC_PROG_CXX # 分解语义版本 VERSION_MAJOR=$(echo $PACKAGE_VERSION | cut -d. -f1) VERSION_MINOR=$(echo $PACKAGE_VERSION | cut -d. -f2) VERSION_PATCH=$(echo $PACKAGE_VERSION | cut -d. -f3) AC_MSG_NOTICE([--- Version: $VERSION_MAJOR.$VERSION_MINOR.$VERSION_PATCH]) AC_SUBST(VERSION_MAJOR, [$VERSION_MAJOR]) AC_SUBST(VERSION_MINOR, [$VERSION_MINOR]) AC_SUBST(VERSION_PATCH, [$VERSION_PATCH]) # 根据语义版本0.1.0推导Libtool version-info LT_VERSION="1:0:1" AC_SUBST(LT_VERSION) AC_OUTPUT
验证修改
重新执行autoreconf -i && ./configure && make后,生成的共享库文件应为:
libWebLoom.so -> libWebLoom.so.0.1.0 libWebLoom.so.0 -> libWebLoom.so.0.1.0 libWebLoom.so.0.1.0
内容的提问来源于stack exchange,提问作者Swatcat
相关产品推荐
相关产品推荐

