可能未定义的宏:AC_MSG_ERROR

147

我在configure.ac文件中有以下内容:

AC_CHECK_PROGS(MAKE,$MAKE make gmake,error)
if test "x$MAKE" = "xerror" ;then
  AC_MSG_ERROR([cannot find a make command])
fi

这个问题在我们的项目中存在很长时间了,但在某些设置中,我会收到这个错误:

configure.ac:45: error: possibly undefined macro: AC_MSG_ERROR
  If this token and others are legitimate, please use m4_pattern_allow.
  See the Autoconf documentation.

最近添加的这些行:

AC_CONFIG_MACRO_DIR([m4])
LT_INIT

有谁能解释一下这个错误是什么原因,并且如何追踪问题?

编辑:添加有关差异的详细信息。

正常工作的框:

uname -a Linux host1 2.6.38-13-generic #53-Ubuntu SMP Mon Nov 28 19:33:45 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux

automake: 1.11.1
autoconf: 2.67
m4: 1.4.14
libtoolize: 2.2.6b

无法使用的盒子:

Linux host2 2.6.32-35-generic-pae #78-Ubuntu SMP Tue Oct 11 17:01:12 UTC 2011 i686 GNU/Linux

automake: 1.11.1
autoconf: 2.65
m4: 1.4.13
libtoolize: 2.2.6b

最新编辑:只有32位机器会遇到这个问题。

更新:我能够在一台安装有autoconf 2.67automake 1.11.1libtool 2.2.6bm4 1.4.14的CentOS机器上重现这个问题。这只是32位机器的一个错误吗?


1
为什么这是个问题?使用autoconf 2.67构建您的tarballs。您只需要在一台机器上安装autoconf即可! - William Pursell
1
我知道我可以很容易地解决这个问题,我只是想确保这是一个单独的问题,而不是我们的configure.ac或其他配置文件中的问题。 - dbeer
我知道 autoconf 2.64 被认为相当有 bug。可能你正在遇到 2.65 版本的一个 bug。 - William Pursell
1
我能够在另一台32位机器上重现这个问题,使用的是autoconf 2.67、automake 1.11.1、libtool 2.2.6b和m4 1.4.14。 - dbeer
1
我无法想象这是否有帮助: 但你是否尝试过AC_CHECK_PROGS([MAKE],[$MAKE make gmake],[error])?这明显是一个m4问题,完全引用m4的事情只会有好处。这行代码可能不是罪魁祸首,但似乎某个地方存在引号问题。你可以发布完整的configure.ac吗? - William Pursell
整个文件超过2000行,但它是TORQUE开源项目的一部分。您可以检查源代码svn co svn://svn.clusterresources.com/torque/trunk。 - dbeer
21个回答

321
我遇到了相同的问题,发现缺少 pkg-config 包。
安装该软件包后,一切生成正常。

2
谢谢!为了让下一个有同样问题的人能够理解,我来概述一下我的情况。为了实现可重复构建,我必须使用自定义路径的工具链来使用所有GNU Build System工具。安装pkg-config的等效方法不仅是修改PATH,还要在autoreconf命令行中添加"-I /toolchain_local/pkg-config-0.23/share/aclocal"。花了我一些时间才意识到pkg-config不仅安装二进制文件。rpm -ql pkgconfig帮了我很大的忙。 - Assambar
12
我需要安装 libtool - Mitar
15
技术上讲,这并没有解决问题。在这种情况下,AC_MSG_ERROR 实际上是想说“你需要安装 pkg-config”,但由于某些原因无法打印此消息(出现了关于 AC_MSG_ERROR 的错误)。通过安装 pkg-config,不再需要打印错误消息,所以跳过了 AC_MSG_ERROR 行并且工作正常。如果您正在安装别人的软件包,那么很好。但如果是您自己的代码,您仍然没有解决问题 :-) - Malvineous
34
我之前遇到过这个问题,安装autoconf-archive软件包解决了它。 - jonthalpy
7
哇,这是一个自动重新配置的示例,它输出了一个非常糟糕的错误消息。 - John Greene
显示剩余3条评论

34

建议使用 autoreconf -fi 代替手动调用 aclocal;autoconf;automake; #and whatever else 来正确填充 aclocal.m4 等。

如果不使用自己的 m4 文件,则目前将 ACLOCAL_AMFLAGS = -I m4 (添加到顶层 Makefile.am)和 AC_CONFIG_MACRO_DIR([m4]) 仍为可选项,但当然,这样做可以消除过程中的警告 :)


我们有m4文件,所以这对我们来说是必需的。同时,将autoreconf -fi更改为其他内容会产生相同的错误。 - dbeer
1
еҰӮжһңдҪ жңүm4ж–Ү件пјҢACLOCAL_AMFLAGSе’ҢAC_CONFIG_MACRO_DIRжӯЈжҳҜдҪ еә”иҜҘеҒҡзҡ„гҖӮ(并е°Ҷж–Ү件ж”ҫеңЁm4/дёӯпјҢжҲ–иҖ…дҪ жҢҮе®ҡзҡ„зӣ®еҪ•дёӯ) - jørgensen
谢谢,autoreconf -fi 使PCRE编译成功。 - uınbɐɥs
我曾经遇到过完全相同的问题,并发现我在Makefile.am中漏掉了设置ACLOCAL_AMFLAGS - 谢谢! - simpleigh
7
Autotools太烂了...这些玩意儿一点也不合理。30年过去了,为什么还是这么烂呢? - jww

31

我自己的configure.ac也遇到了这个问题,但是针对这种情况(并且为了受益于此处来自Google的任何人),原因是我不小心在AC_MSG_ERROR中添加了引号,所以它被视为字符串:

AX_BOOST_BASE([1.42], [], [AC_MSG_ERROR([Could not find Boost])])

我将AC_MSG_ERROR宏周围的方括号删除后,它就奏效了:

AX_BOOST_BASE([1.42], [], AC_MSG_ERROR([Could not find Boost]))
那些建议你安装pkg-config或某个软件包的评论没有抓住重点。 AC_MSG_ERROR应该起作用并给出有用的信息,例如“您需要安装软件包XYZ”,但由于某些问题,AC_MSG_ERROR无法正常工作。安装软件包XYZ肯定会使错误消失,但这仅因为一旦软件包在那里,就不再需要打印错误消息了!因此,安装pkg-config或特定软件包只是绕过问题,而并非真正解决问题。

它消除了错误。但是在./configure脚本上会抛出错误。 - Muhammad Irvan Hermawan

17

我在RHEL7.5上使用otto-de/libvmod-uuid时也遇到了同样的问题。

后来通过安装"autoconf-archive"软件包解决了该问题。


2
我需要安装"autoconf-archive" Debian软件包来构建powertop v2.31-rc1。 - dileks
我需要这个来构建tpm2-tools。 - Ed McMan
需要在macOS上用Python - undefined

13

我也遇到了类似的问题...我的解决方案是

apt-get install libcurl4-openssl-dev

(我已经安装了libcurl)对我来说有效。。


11

我在CentOS 7下遇到了同样的问题。

在我的情况下,安装了libcurl-devel(这台机器上已经安装了libcurl),问题得到了解决。


6
我在这个问题上浪费了几个小时,我的结论是:
- 根据版本和其他本地条件的不同,autoconf会在遇到任何未定义的宏时输出有关AC_MSG_ERROR未定义的消息。 AC_MSG_ERROR是一个误导。未定义宏的原因可能是:
- 文件中宏名称的拼写错误,或者未随tarball一起传送的本地宏。 - 缺少一个包,该包将与一组autoconf宏一起提供,其中一个用于文件中。缺失的通常是pkg-config(例如,PKG_CHECK_MODULES),但也可能是其他提供所需但缺失宏的任何其他包。当然,令人恶心的是,在仍不存在configure脚本可以检查缺失包之前,就会发生这种情况…

这就是答案!最终,这是autoconf给出的一个糟糕的错误信息。 - marshall.ward

6

出现这个问题有两种可能的原因:

  1. 没有安装aclocal。
    解决方案:安装libtool

    • 对于ubuntu:sudo apt-get install libtool
    • 对于centos:sudo yum install libtool
  2. LIBTOOL.m4的路径错误。
    解决方案:

    1. 使用aclocal --print-ac-dir检查当前aclocal的路径(通常应该是“/usr/share/aclocal”或“/usr/local/share/aclocal”)
    2. 然后检查是否存在*.m4文件。
    3. 如果没有,则将相应的*.m4文件复制到此路径。 (也许是cp /usr/share/aclocal/*.m4 /usr/local/share/aclocal/cp /usr/local/share/aclocal/*.m4 /usr/share/aclocal/

希望能够帮到你


4

针对Debian系统,所需的软件包如下: m4、automake、pkg-config和libtool。


3

您是否正在设置本地的'm4'目录?例如,

> aclocal -I m4 --install

一些软件包附带有autogen.shinitgen.sh shell脚本来运行glibtoolize,autoheader,autoconf和automake。以下是我使用的autogen.sh脚本:

#! /bin/sh

case `uname` in Darwin*) glibtoolize --copy ;;
  *) libtoolize --copy ;; esac

autoheader
aclocal -I m4 --install
autoconf

automake --foreign --add-missing --force-missing --copy

编辑

你可能需要在顶级Makefile.am中添加ACLOCAL_AMFLAGS = -I m4


autoreconf在Darwin上无法选择正确的libtoolize吗? - William Pursell
我正在设置本地的'm4'目录。我在aclocal中添加了-I m4 --install,但是我仍然得到相同的错误。这是我的autogen.sh脚本:libtoolize -c -f autoheader -f aclocal -I m4 --install autoconf -f automake --foreign --add-missing --force-missing --copy - dbeer
1
@dbeer,添加了ACLOCAL_AMFLAGS变量? - Brett Hale
@WilliamPursell 不,它不是。MacOS将GNU libtool命名为“glibtool”,而由Apple提供的(不像GNU libtool预期的那样)命名为“libtool”。请注意,libtoolize也被安装为“glibtoolize”。这可以通过指定LIBTOOLIZE和LIBTOOL宏来覆盖。尽管这个autogen示例很好,但通常最好只运行autoreconf -fi,并让它从上一次运行中猜测/恢复-I标志,特别是当软件不属于您时。 - LeoTh3o

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接