如何通过Autotools官方方式修改libtool脚本的link_all_deplibs变量
解决libtool中link_all_deplibs变量的官方设置方法
你的问题核心在于两个常见的Autotools使用误区:重复初始化libtool宏,以及变量设置的时机错误。下面是修正后的方案:
问题分析
- 重复调用libtool初始化宏:你同时使用了
AC_PROG_LIBTOOL和LT_INIT,但AC_PROG_LIBTOOL是过时的宏,它会隐式调用LT_INIT。后续再次调用LT_INIT会重置所有libtool变量,导致你之前用_LT_AC_TAGVAR设置的值被覆盖。 - 变量设置时机错误:
_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
相关产品推荐
相关产品推荐

