【问题标题】:possibly undefined macro: AC_MSG_ERROR可能未定义的宏:AC_MSG_ERROR
【发布时间】:2012-02-07 08:14:11
【问题描述】:

我在 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 位机器会遇到这种困难。

已更新我可以在 CentOS 机器上使用 autoconf 2.67automake 1.11.1libtool 2.2.6bm4 1.4.14 重现该问题。这只是 32 位机器的错误吗?

【问题讨论】:

  • 为什么会出现这个问题?使用 autoconf 2.67 构建您的 tarball。你只需要在一台机器上安装 autoconf!
  • 我知道我可以轻松解决这个问题,我只是想确保它是一个盒子的问题,而不是我们的 configure.ac 或其他配置文件中的问题。跨度>
  • 我知道 autoconf 2.64 被认为是相当有缺陷的。您可能遇到了 2.65 中的错误。
  • 我能够在另一台具有 autoconf 2.67、automake 1.11.1、libtool 2.2.6b 和 m4 1.4.14 的 32 位机器上重现该问题
  • 我无法想象这会有所帮助:但是您尝试过 AC_CHECK_PROGS([MAKE],[$MAKE make gmake],[error]) 吗?这听起来绝对像是 m4 的问题,完全引用 m4 的内容只会有所帮助。这条特定的行可能不是罪魁祸首,但它在某处闻起来像是引用问题。你能发布完整的configure.ac吗?

标签: autotools autoconf


【解决方案1】:

我遇到了同样的问题,发现 pkg-config 包丢失了。

安装包后,一切都正确生成了。

【讨论】:

  • 谢谢!概述我的情况,为下一个穿着同样鞋子的人。为了获得可重现的构建,我必须使用所有 GNU 构建系统工具的自定义路径工具链。安装 pkg-config 的等价物不仅是修改 PATH,还要在 autoreconf 命令行中添加 "-I /toolchain_local/pkg-config-0.23/share/aclocal"。我花了一些时间才意识到 pkg-config 不仅仅安装二进制文件。 rpm -ql pkgconfig 帮助。
  • 我必须安装libtool
  • 仅供参考,从技术上讲,这并不能解决问题。在这种情况下,AC_MSG_ERROR 试图说“您需要安装 pkg-config”,但由于某种原因它无法打印此消息(给出有关 AC_MSG_ERROR 的错误)。通过安装pkg-config,不再需要打印错误消息,因此跳过了AC_MSG_ERROR 行,一切正常。如果你正在安装别人的包,很好,但如果是你自己的代码,你仍然没有解决问题:-)
  • 我之前也遇到过这个问题,安装autoconf-archive包解决了这个问题。
  • 哇,这是 autoreconfig 吐出非常糟糕的错误消息的示例。
【解决方案2】:

建议使用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 会产生相同的错误。
  • 如果你有 m4 文件,ACLOCAL_AMFLAGS 和 AC_CONFIG_MACRO_DIR 正是你应该做的。 (并将文件放在 m4/ 中,分别是您指定的目录)
  • 谢谢,autoreconf -fi 编译了 PCRE。
  • 我遇到了同样的问题,发现我错过了在Makefile.am 中设置ACLOCAL_AMFLAGS - 谢谢!
  • Autotools 太坏了……这些废话都没有意义。 30年后怎么还这么破?
【解决方案3】:

我自己的configure.ac 遇到了这个问题,但在这种情况下(为了谷歌的任何人的利益)这是因为我不小心引用了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 或某些软件包的cmets 没有抓住重点。 AC_MSG_ERROR 应该可以工作并给你一个有用的信息,比如“你需要安装包 XYZ”,但是由于一些问题,AC_MSG_ERROR 不起作用。安装包 XYZ 肯定会让错误消失,但只是因为一旦包在那里,就不再需要打印错误消息了!

所以安装pkg-config 或特定的包只是绕过了问题,实际上并没有解决它。

【讨论】:

    【解决方案4】:

    我也有类似的问题..我的解决方案是

    apt-get install libcurl4-openssl-dev
    

    (我已经安装了 libcurl) 至少为我工作..

    【讨论】:

      【解决方案5】:

      我在 CentOS 7 下也遇到过同样的问题

      在可能的情况下,安装libcurl-devel 后问题就消失了(libcurl 已经安装在这台机器上)

      【讨论】:

        【解决方案6】:

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

        已通过安装“autoconf-archive”包修复

        【讨论】:

        • 我需要“autoconf-archive” Debian 软件包来构建 powertop v2,31-rc1。
        【解决方案7】:

        对于 Debian。 所需的软件包是: m4 automake pkg-config libtool

        【讨论】:

          【解决方案8】:

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

          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/share/aclocal”)
            2. 然后检查是否有 *.m4 文件。
            3. 如果没有,则将对应的 *.m4 文件 cp 到此路径。(可能是 cp /usr/share/aclocal/*.m4 /usr/local/share/aclocal/cp /usr/local/share/aclocal/*.m4 /usr/share/aclocal/

          希望对你有帮助

          【讨论】:

            【解决方案9】:

            您是否设置了本地“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
            

            编辑

            您可能需要将ACLOCAL_AMFLAGS = -I m4 添加到顶级Makefile.am

            【讨论】:

            • autoreconf 没有在 Darwin 上选择正确的 libtoolize 吗?
            • 我正在设置一个本地“m4”目录。我将 -I m4 --install 添加到 aclocal,但我得到了同样的错误。这是我的 autogen.sh 脚本: libtoolize -c -f autoheader -f aclocal -I m4 --install autoconf -f automake --foreign --add-missing --force-missing --copy
            • @dbeer,添加了ACLOCAL_AMFLAGS 变量?
            • @WilliamPursell 不,它没有。 MacOS 将 GNU libtool 称为“glibtool”,而 Apple 提供的(其行为与 GNU libtool 所期望的不同)为“libtool”。请注意,libtoolize 也安装为“glibtoolize”。这可以通过指定 LIBTOOLIZE 和 LIBTOOL 宏来覆盖。尽管这个 autogen 示例很好,但通常最好简单地运行 autoreconf -fi 并让它猜测/恢复上次运行的 -I 标志,尤其是当软件不是你的时。
            【解决方案10】:

            错误是由 autom4te 生成的。如果设置正确,则生成该错误的代码部分应该永远不会看到“AC_MSG_ERROR”,因为在此之前它应该已经扩展了 m4。您说该错误仅在“某些设置中”发生。我建议在这些设置中,您的 autoconf 安装是 fubar。可能您安装了不兼容的 m4 版本。

            【讨论】:

            • 我正在使用 autoconf 2.65 和 m4 1.4.13。这些兼容吗?
            • m4 1.4.13 足够新,不太可能出现问题。您能否确定您看到警告的设置与您没有看到警告的设置有何不同?
            • 我刚刚在我的问题中添加了一些关于此的信息 - 你能想到其他相关的吗?我对自动工具不是很了解。
            • 刚刚注意到 - 32 位机器似乎有困难。
            【解决方案11】:

            使用 MacOS X

            sudo port install pkgconfig
            

            是解决方案!

            【讨论】:

            • 这个答案已经过时了,使用 brew 而不是 port
            【解决方案12】:

            在带有 brew 的 Mac OS X el Captain 上,尝试:
            冲泡安装 pkgconfig

            这对我有用。

            【讨论】:

              【解决方案13】:

              我刚刚在这个上浪费了几个小时。我的结论:

              • 根据版本和任何其他本地条件,autoconf 在遇到ANY undefined 宏时会输出有关 AC_MSG_ERROR undefined 的消息。 AC_MSG_ERROR 是一个红鲱鱼。未定义宏的原因可能是:
                • 文件中的宏名称拼写错误,或本地宏未随 tarball 一起提供
                • 缺少一个包含一组 autoconf 宏的包,其中一个在文件中使用。 pkg-config 通常是缺少的(因为,例如,PKG_CHECK_MODULES),但这可能是任何其他提供所需但不存在的宏的包。当然,恶毒的事情是,这发生在仍然不存在的配置脚本可以检查丢失的包之前......

              【讨论】:

                【解决方案14】:

                我在 Ubuntu (error: possibly undefined macro: AC_MSG_ERROR) 上遇到了同样的问题,但上面的答案对我不起作用。我找到了解决方案here

                成功了:

                $ LANG=C LC_CTYPE=C ./autogen.sh
                

                【讨论】:

                  【解决方案15】:

                  在 Mac 上安装 pkg-config (brew install pkg-config) 后我的问题得到解决

                  【讨论】:

                    【解决方案16】:

                    我通过yum install libtool解决了这个问题

                    【讨论】:

                    • 在我完成编译 pkg-config 之后
                    【解决方案17】:

                    我在尝试使用 jhbuild 构建 amtk 和 utthpmock 时遇到了类似的问题。

                    我需要安装最新版本的 autoconf-archive。说明在https://github.com/autoconf-archive/autoconf-archive/blob/master/README-maint。最后我又添加了sudo make install

                    最后一步是更新我的ACLOCAL_PATH

                    echo 'export ACLOCAL_PATH=$ACLOCAL_PATH:/usr/local/share/aclocal' >> ~/.bashrc
                    

                    经过source ~/.bashrc,终于找到了所有的宏,构建成功。

                    【讨论】:

                      【解决方案18】:

                      当我在本地定义的宏的参数中忘记了 , 时,这发生在我身上。花了几个小时试图弄清楚(几乎不熟悉自动工具)......

                      AC_CHECK_MACRO([Foo]
                          AC_LOCAL_DO([......
                      

                      应该是

                      AC_CHECK_MACRO([Foo],      # <-- Notice comma, doh!
                          AC_LOCAL_DO([......
                      

                      似乎它应该给我一个错误之类的,但我想作为一个宏处理器,它只能做它告诉我的事情。

                      【讨论】:

                        【解决方案19】:

                        您正在一个版本/位置中提取 automake,而在另一个版本/位置中提取 autoconf。你要么想从你的路径中删除有问题的 autoconf 或 automake 并确保你有正确的版本

                        【讨论】:

                        • 虽然 Automake 是 Autoconf 的附属品,但两者是独立的项目。它们之间没有版本锁定。存在 一些 版本依赖性,但是这个 10 年前的问题声称正在使用的版本组合是有效的。
                        • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
                        【解决方案20】:

                        我在新安装的机器上的 Macports 端口“openocd”(本地修改了 Portfile 以使用 git 存储库)遇到了同样的问题。

                        永久修复很容易,在 Portfile 中定义对 pkgconfig 的依赖项: 依赖库附加端口:pkgconfig

                        【讨论】:

                          猜你喜欢
                          • 2015-04-18
                          • 2018-06-14
                          • 1970-01-01
                          • 2019-05-07
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多