You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

结合计算规则反推:

  1. minor = age → age = 1
  2. major = current - age → current = 0 + 1 = 1
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 16:08:13