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

如何通过Autotools官方方式修改libtool脚本的link_all_deplibs变量

你的问题核心在于两个常见的Autotools使用误区:重复初始化libtool宏,以及变量设置的时机错误。下面是修正后的方案:

问题分析

  1. 重复调用libtool初始化宏:你同时使用了AC_PROG_LIBTOOL和LT_INIT,但AC_PROG_LIBTOOL是过时的宏,它会隐式调用LT_INIT。后续再次调用LT_INIT会重置所有libtool变量,导致你之前用_LT_AC_TAGVAR设置的值被覆盖。
  2. 变量设置时机错误:_LT_AC_TAGVAR需要在libtool变量初始化完成后设置,否则会被初始化过程覆盖。

修正后的configure.ac示例

AC_PREREQ(2.61)
AC_INIT([TEST_PROJ],[3.6],[a.a.godin@gmail.com])
dnl end versions
dnl project general settings
AC_CONFIG_AUX_DIR([.])
AC_CONFIG_MACRO_DIR([m4])
AC_CANONICAL_TARGET
AC_CANONICAL_HOST
AC_CANONICAL_BUILD
AC_PROG_CC_C99
AC_PROG_CXX
AM_INIT_AUTOMAKE(TEST_PROJ, 3.6, foreign)
# 使用LT_INIT替代过时的AC_PROG_LIBTOOL,完成libtool初始化
LT_INIT
# 在LT_INIT之后设置各tag的link_all_deplibs变量
_LT_AC_TAGVAR(link_all_deplibs, CC)=no  # 针对C编译器
_LT_AC_TAGVAR(link_all_deplibs, CXX)=no # 针对C++编译器
AC_CONFIG_FILES(Makefile)
AC_OUTPUT

关键说明

  • 移除AC_PROG_LIBTOOL:现代Autotools推荐直接使用LT_INIT,它包含了AC_PROG_LIBTOOL的功能,且更灵活。
  • 设置时机:必须在LT_INIT之后调用_LT_AC_TAGVAR,因为LT_INIT会完成所有libtool变量(包括各tag的link_all_deplibs)的初始化工作,之后设置的值才会被保留并写入最终的libtool脚本。
  • 明确指定tag:CC对应C语言工具链,CXX对应C++工具链,明确指定可以避免默认tag的歧义问题。

验证方法

运行以下命令生成并验证配置:

autoreconf -i
./configure
# 检查生成的libtool脚本中的变量值
grep 'link_all_deplibs=' libtool

你会看到对应tag的link_all_deplibs已经被设置为no,无需手动修改脚本。

内容的提问来源于stack exchange,提问作者Alexey Godin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:29:14