如何解决“可能未定义的宏:AC_MSG_ERROR”

时间:2018-01-04 11:00:15

标签: autotools autoconf m4

我正在尝试从GutHub来源构建libpsl。它需要# Try to reconfigure. Autotools is so broken... libtoolize --force && aclocal && autoheader && autoreconf --force --install ... libtoolize: copying file 'm4/ltversion.m4' libtoolize: copying file 'm4/lt~obsolete.m4' configure.ac:62: error: possibly undefined macro: AC_MSG_ERROR If this token and others are legitimate, please use m4_pattern_allow. See the Autoconf documentation. configure.ac:68: error: possibly undefined macro: AC_MSG_CHECKING configure.ac:70: error: possibly undefined macro: AC_MSG_RESULT configure.ac:87: error: possibly undefined macro: AC_LINK_IFELSE configure.ac:88: error: possibly undefined macro: AC_LANG_PROGRAM configure.ac:222: error: possibly undefined macro: AC_SEARCH_LIBS ... Autotools is failing with

-v

我找到了Possibly undefined macro: AC_MSG_ERRORAS_IF and AC_MSG_ERROR: error: possibly undefined macro,但猜测并没有解决我的问题。我花了大约4个小时尝试猜测。

我想停止猜测并解决问题。我遇到的问题是,我无法找到有关解决Autotools问题的信息或程序。 Confer,"troubleshoot" autoconf site:gnu.org

我提出的最好的方法是使用general.m4运行命令,但我没有看到尝试复制general.m4。如果我没有弄错的话,AC_MSG_ERROR提供了$ find /usr/local -name general.m4 /usr/local/share/autoconf/autoconf/general.m4 /usr/local/share/autoconf/autotest/general.m4 ,所以我应该看到它被访问了。所以我的程序有明显的差距或缺陷。文件存在:

Possibly undefined macro: AC_MSG_ERROR

如何解决Autotools的 WITH Encashment AS ( SELECT T.MachineId, T.Amount, CAST(Occured AS DATETIME) AS Occured FROM (VALUES (1, 101, '2017-10-20 09:36:40.057') ,(1, 203, '2017-10-14 12:36:30.081') ,(1, 400, '2017-10-11 04:17:38.023') ) AS T(MachineId, Amount, Occured) ), MoneyAccepted AS ( SELECT T.MachineId, T.Amount, CAST(Occured AS DATETIME) AS Occured FROM (VALUES (1, 1, '2017-10-15 09:36:40.057') ,(1, 100, '2017-10-16 12:36:30.081') ,(1, 100, '2017-10-12 16:17:38.023') ,(1, 1, '2017-10-13 09:37:47.057') ,(1, 1, '2017-10-13 09:37:47.057') ,(1, 1, '2017-10-12 15:37:47.057') ,(1, 100, '2017-09-15 12:37:31.081') ,(1, 100, '2017-09-15 16:37:31.081') ,(1, 100, '2017-09-16 13:37:31.081') ,(1, 100, '2017-09-17 13:37:31.081') ) AS T(MachineId, Amount, Occured) ) 问题?

2 个答案:

答案 0 :(得分:2)

  

如何使用Autotools解决可能未定义的宏:AC_MSG_ERROR 问题?

首先,在可能的情况下,应该通过不重建构建系统来完全避免这种情况。 Autotools构建系统不需要重建作为构建程序包的先决条件,因此第一步应该是在不运行Autotools的情况下尝试./configure; make

如果你确实需要重建构建系统,这有时是必要的,因为即使是最好的Autotools黑客也不可能解释所有可能的当前和未来的构建环境,那么第一部分是确保你有最新版本的Autotools并运行autoreconf --install --force(我看到你已经在做了)。这可确保为您拥有的Autotools版本正确设置所有内容。

这带来了我们关于故障排除的实际问题,特别是关于引用标准Autoconf宏(例如AC_MSG_ERROR)的错误排除方法。您可以使用多种工具和方法,其中包括:

  • 查看警告中报告的configure.ac行,尤其是最低的行,以及前面的行。此特定错误表示文本正在发送到看起来像未展开的宏名称的输出文件中,因此问题通常来自错误的引用或未关闭的宏参数列表。

    • 使用将为您进行括号匹配的编辑器可以帮助您轻松验证每个宏的参数列表真正的结束位置。
    • 使用知道如何对Autoconf源文件进行代码突出显示的编辑器会特别有用。
  • 检查Autoconf输出的configure脚本。找到它出错的地方(在这种情况下,未展开的宏名称将帮助您找到它),并将该值和前面的正确输出与您configure.ac的内容以及它所依赖的任何外部宏定义相关联。这可以帮助您查明错误的位置。

  • 您可以使用#dnl注释掉Autoconf源代码行,以应用二分法来追踪错误的行。

  • 直接运行autoconf,使用额外的面向调试的选项。例如,

    autoconf --verbose --force --warnings=all
    

    还有一个--debug选项可以保留临时文件,但我怀疑它对您的用途没那么有用。

  • 在某些情况下,通过使用--trace选项跟踪对一个或多个宏的调用可能会有所帮助,尽管我没有看到与您询问的特定错误如此相关。请注意,跟踪输出取代autoconf通常输出的配置脚本。

答案 1 :(得分:0)

我认为评论中的ptomato最接近答案。通常当AC_MSG_ERROR(标准的autoconf宏)被认为是“未定义”时,可以在错误本身之前的行上找到该错误。不一定是之前的行,而是上面的一行。

在这种情况下,错误位于line 62,因此我会去寻找最近的非默认宏调用。

line 39上有GTK_DOC_CHECK来电,但受m4_ifdef保护,因此即使您没有安装gtkdoc-devel或类似软件包也应该是安全的

line 33上有AM_GNU_GETTEXT_VERSION的无保护号码,我的猜测就是问题所在。确保你有gettext-devel或同等的包,然后再试一次。