【问题标题】:How to overcome "'aclocal-1.15' is missing on your system" warning?如何克服“系统上缺少'aclocal-1.15'”警告?
【发布时间】:2016-01-21 14:35:41
【问题描述】:

我试图在 github 上运行一个 c++ 程序。 (可在以下链接https://github.com/mortehu/text-classifier获得)

我有一个 mac,并试图在终端中运行它。我想我已经下载了 autoconf 和 automake 但不确定。要运行程序,我将转到终端中的正确文件夹,然后运行

./configure && make 

但我得到了错误:

警告:您的系统上缺少“aclocal-1.15”。 只有修改了 'acinclude.m4' 或 'configure.ac' 或 'configure.ac' 包含的 m4 文件。 'aclocal' 程序是 GNU Automake 软件包的一部分: http://www.gnu.org/software/automake 它还需要 GNU Autoconf、GNU m4 和 Perl 才能运行: http://www.gnu.org/software/autoconf http://www.gnu.org/software/m4/ http://www.perl.org/ make: *** [aclocal.m4] 错误 127

我有 xcode 和 g++ 以及运行 c 程序所需的所有东西,但很明显,我不知道我在做什么。

运行上述链接中的程序的最简单、最简单的方法是什么?我意识到它带有自述文件和示例用法,但我无法让它发挥作用。

【问题讨论】:

  • "运行 c 程序所需的所有东西" -- 你需要所有东西来编译程序,在这种情况下包括包automake、@987654330 @、m4perl,正如消息中明确指出的那样……“我想我已经下载了 autoconf 和 automake,但不确定”——我很确定你还没有安装 至少它是正确的。 ;-)

标签: c++ github makefile automake


【解决方案1】:

在运行./configure 之前尝试运行autoreconf -f -i。 autoreconf 程序会根据需要自动运行 autoheader、aclocal、automake、autopoint 和 libtoolize。

编辑添加: 这通常是由于从 Git 中签出代码而不是从 .zip.tar.gz 存档中提取代码造成的。为了在文件更改时触发重建,Git 不保留文件的时间戳,因此configure 脚本可能看起来已经过时。正如其他人所提到的,如果您没有足够新的 autoreconf 版本,有一些方法可以解决这个问题。

另一个编辑: 此错误也可能是由于将使用 scp 从存档中提取的源文件夹复制到另一台机器而引起的。时间戳可以更新,表明需要重建。为避免这种情况,请复制存档并将其提取到位。

【讨论】:

  • 谢谢莫特胡!但我随后得到错误:在从 base/columnfile.cc:1 包含的文件中:./base/columnfile.h:8:10:致命错误:找不到'kj/debug.h'文件#include 我错过了一个文件吗?
  • 是的,您缺少 libkj,它是 Cap'n Proto 项目的一部分。您还需要 libsnappy。
  • 好的,我终于拥有了所有必要的工具来配置、制作和安装。似乎一切正常,但可执行文件在哪里?不确定这是否重要或相关,但当我进行安装时,我收到以下消息(作为更大消息的一部分):# 不是目标:安装:# 命令行目标。 # 隐式规则搜索尚未完成。 # 修改时间从未检查过。 # 文件尚未更新。这是否意味着没有创建输出文件?
  • 程序应以tools/text-classifier/text-classifier 结尾。我不知道为什么make install 不起作用。
  • 如果您在项目中运行 ./configure 然后更新 automake 包,则可能会发生这种情况
【解决方案2】:

通常,您不需要任何auto* 工具,最简单的解决方案是在相关文件夹中简单地运行touch aclocal.m4 configure(如果它们存在,还要在Makefile.amMakefile.in 上运行touch)。这将更新aclocal.m4 的时间戳并提醒系统aclocal.m4 是最新的,不需要重建。在此之后,最好清空您的build 目录并在执行此操作后从头开始重新运行configure。我经常遇到这个问题。对我来说,根本原因是我从另一个文件夹中复制了一个库(例如 mpfr 代码为 gcc)并且时间戳发生了变化。

当然,如果您确实需要重新生成这些文件,则此技巧无效,可能是因为您手动更改了它们。但希望该软件包的开发人员分发最新的文件。


当然,如果您确实想安装 automake 和朋友,请为您的分发使用适当的包管理器。


安装automake自带的aclocal:

brew install automake          # for Mac
apt-get install automake       # for Ubuntu

再试一次:

./configure && make 

【讨论】:

  • 之后我得到:configure.ac:25: error: Autoconf version 2.69 or later is required ... WARNING: 'aclocal-1.15' 可能太旧了。 ... make: *** [aclocal.m4] 错误 63
  • 然后在安装 autoconf v2.69 后我得到:libtool:版本不匹配错误。这是 libtool 2.4.2 Debian-2.4.2-1.11,但是这个 LT_INIT 的 libtool: 定义来自 libtool 2.4.4。 libtool:您应该使用 libtool 2.4.2 Debian-2.4.2-1.11 libtool: 中的宏重新创建 aclocal.m4,然后再次运行 autoconf。
  • 确保你已经完成brew install libtool,然后运行aclocal,然后运行autoconf
  • 我更新了 libtool 但现在我得到:libtool: 版本不匹配错误。这是 libtool 2.4.2 Debian-2.4.2-1.11,但是这个 LT_INIT 的 libtool: 定义来自 libtool 2.4.6。 libtool:您应该使用 libtool 2.4.2 Debian-2.4.2-1.11 libtool: 中的宏重新创建 aclocal.m4,然后再次运行 autoconf。
  • 这样就解决了问题。但这不是必需的,因为它需要许多其他东西(root 权限、网络连接、新软件的更多空间等)。下面 Droopycon 的解决方案是(接近)一个正确的答案,因为错误消息清楚地表明“只有在修改了 'acinclude.m4' 或 'configure.ac' 或 'configure.ac' 包含的 m4 文件时才需要它。” .
【解决方案3】:

您可以轻松安装所需的版本:

先获取源码:

$ wget https://ftp.gnu.org/gnu/automake/automake-1.15.tar.gz

解压:

$ tar -xzvf automake-1.15.tar.gz

构建和安装:

$ cd automake-1.15
$ ./configure  --prefix=/opt/aclocal-1.15
$ make
$ sudo mkdir -p /opt
$ sudo make install

使用它:

$ export PATH=/opt/aclocal-1.15/bin:$PATH
$ aclocal --version

aclocal (GNU automake) 1.15

现在,当调用 aclocal 时,您会得到正确的版本。

【讨论】:

  • 这为我安装了“aclocal”。我通过 CygWin 的 UI 安装程序通过搜索“automake”并选择版本 11-1 安装了它。
【解决方案4】:

可能适用于或不适用于此特定情况的通用答案:

正如错误消息提示的那样,仅当您修改了用于生成 aclocal.m4 的文件时才需要 aclocal-1.15

如果您不修改任何这些文件(包括 configure.ac),那么您应该不需要 aclocal-1.15。

在我的例子中,问题不在于这些文件中的任何一个都被修改了,而是 configure.ac 上的时间戳与 aclocal.m4 相比晚了 6 分钟。

我还没弄清楚为什么,但是我的 git repo 的干净克隆为我解决了这个问题。也许与 git 相关的东西以及它最初是如何创建文件的。

与其重新运行 autoconf 和朋友,我会尝试获得一个干净的克隆并重试

也可能有人对 configure.ac 进行了更改,但没有重新生成 aclocal.m4,在这种情况下,您确实必须重新运行 automake 和朋友。

【讨论】:

  • 更合适的答案。我得到了类似的错误,因为我没有从 squid 提供的 tar 中提取源文件。相反,我复制了已经提取的文件夹,并且我的复制文件顺序不同,这导致了错误。我只是直接从tar中重新提取并开始工作。如果有机会,我会将 Droopycon 的解决方案标记为正确答案。
  • 太棒了!我曾使用rsync 将已经提取的文件从一台服务器复制到另一台服务器(而不是复制压缩的源档案),而不保留时间戳。当我改为复制源存档并在目标机器上提取它们时,问题没有发生。谢谢!
  • 确实,答案通常是“Checkout the repo fresh”。很棒的答案和赏金!
【解决方案5】:

Autotools 的全部意义在于提供一种基于 M4 宏的神秘语言,该语言最终编译为名为 ./configure 的 shell 脚本。您可以将此编译后的 shell 脚本与源代码一起发布,并且该脚本应该做所有事情来检测环境并准备构建程序。只有想要调整测试并刷新 shell 脚本的人才需要使用 Autotools。

如果必须在系统上安装 GNU This 和 GNU That 以使其工作,它就违背了 Autotools 的意义。最初,它的发明是为了简化程序到各种 Unix 系统的移植,不能指望这些系统上有任何东西。即使是 ./configure 中生成的 shell 代码所使用的结构,也必须非常仔细地选择,以确保它们几乎可以在每个损坏的旧 shell 上工作。

您遇到的问题是由于根本不了解 Autotools 的用途以及最终 ./configure 脚本的作用的人发明的一些损坏的 Makefile 步骤。

作为一种解决方法,您可以进入 Makefile 并进行一些更改以解决此问题。例如,我正在构建 GNU Awk 的 Git 头并遇到同样的问题。但是,我将此补丁应用于Makefile.in,并且我可以成功make gawk

diff --git a/Makefile.in b/Makefile.in

index 5585046..b8b8588 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -312,12 +312,12 @@ distcleancheck_listfiles = find . -type f -print

 # Directory for gawk's data files. Automake supplies datadir.
 pkgdatadir = $(datadir)/awk
-ACLOCAL = @ACLOCAL@
+ACLOCAL = true
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
+AUTOCONF = true
+AUTOHEADER = true
+AUTOMAKE = true
 AWK = @AWK@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@

基本上,我改变了一些东西,以便用无害的true shell 命令代替所有的 Auto-stuff 程序。

Gawk 的实际构建步骤不需要 Auto-stuff!它仅涉及在部分 Auto-stuff 已更改并需要重新处理时调用的某些规则。但是,Makefile 的结构是这样的,如果工具不存在,它就会失败。

上述补丁之前:

$ ./configure
[...]
$ make gawk
CDPATH="${ZSH_VERSION+.}:" && cd . && /bin/bash /home/kaz/gawk/missing aclocal-1.15 -I m4
/home/kaz/gawk/missing: line 81: aclocal-1.15: command not found
WARNING: 'aclocal-1.15' is missing on your system.
         You should only need it if you modified 'acinclude.m4' or
         'configure.ac' or m4 files included by 'configure.ac'.
         The 'aclocal' program is part of the GNU Automake package:
         <http://www.gnu.org/software/automake>
         It also requires GNU Autoconf, GNU m4 and Perl in order to run:
         <http://www.gnu.org/software/autoconf>
         <http://www.gnu.org/software/m4/>
         <http://www.perl.org/>
make: *** [aclocal.m4] Error 127

补丁后:

$ ./configure
[...]
$ make gawk
CDPATH="${ZSH_VERSION+.}:" && cd . && true -I m4
CDPATH="${ZSH_VERSION+.}:" && cd . && true
gcc -std=gnu99 -DDEFPATH='".:/usr/local/share/awk"' -DDEFLIBPATH="\"/usr/local/lib/gawk\"" -DSHLIBEXT="\"so"\" -DHAVE_CONFIG_H -DGAWK -DLOCALEDIR='"/usr/local/share/locale"' -I.     -g -O2 -DNDEBUG -MT array.o -MD -MP -MF .deps/array.Tpo -c -o array.o array.c 
[...]
gcc -std=gnu99  -g -O2 -DNDEBUG  -Wl,-export-dynamic -o gawk array.o awkgram.o builtin.o cint_array.o command.o debug.o dfa.o eval.o ext.o field.o floatcomp.o gawkapi.o gawkmisc.o getopt.o getopt1.o int_array.o io.o main.o mpfr.o msg.o node.o profile.o random.o re.o regex.o replace.o str_array.o symbol.o version.o      -ldl -lm
$ ./gawk --version
GNU Awk 4.1.60, API: 1.2
Copyright (C) 1989, 1991-2015 Free Software Foundation.
[...]

我们去吧。如您所见,CDPATH= 命令行是调用 Auto-stuff 的位置,您可以在其中看到 true 命令。这些报告成功终止,因此它只是通过那个垃圾来进行该死的构建,这是完美配置的。

我做了make gawk 因为有一些子目录构建失败;必须为各自的 Makefile 重复该技巧。

如果您在使用来自其开发人员的原始官方 tarball 程序时遇到这种情况,请投诉。它应该只是解压缩,./configuremake,而无需您修补任何东西或安装任何 Automake 或 Autoconf 材料。

理想情况下,拉动他们的 Git 头也应该是这样。

【讨论】:

  • 您为什么认为 Makefile 已损坏?正如 emlai 的回答中所指出的,构建系统识别出生成文件的依赖关系已经过时(这可能只是时间戳错误的情况,您可以通过touching 修复它们)。说创建此系统的人不了解它的创建目的(确保您使用所有依赖项构建正确 - 如果它们被更改,则 包括 auto*-parts)并更改Makefiles 不再有效地完全做到这一点似乎......错了。
  • @SimonSobisch 您是否遇到此问题而无法使用答案?
  • 感谢您的提问。不,我没有遇到这个问题,但是从阅读您的帖子中我看到了底线“发生此错误是因为 Makefile 已损坏,而不是 Makefile 应该是什么”-而 Makefile 完全在做什么他们应该(重建需要根据从 C 源重建目标文件的相同规则重建的文件)。在大多数情况下,错误的发生是因为人们在没有必要工具的情况下使用非 dist 包,或者来源中的时间戳被破坏“向作者投诉”。
  • 从不建议将工具更改为true。如果您真的想修复“仅仅因为时间戳”而损坏的部分,则最好针对失败的目标运行make --touch(如果您想收集它们,请运行make --keep-going 以事先获取“损坏”部分的列表)。
  • @SimonSobisch 很好的建议;听起来你在那里有一个单独的答案的开始。在这种情况下,将工具更改为 true 是合理的,因为这些工具对于构建程序是不必要的,而只是为了重建 configure 脚本,该脚本已经以预构建的形式提供。触摸时间戳以抑制运行工具的尝试可以达到相同的效果。
【解决方案6】:

2018,又一个解决方案...

https://github.com/apereo/mod_auth_cas/issues/97

某些情况下只是运行

$ autoreconf -f -i

没有别的......解决问题。

您在目录/pcre2-10.30 中执行此操作。

真是一场噩梦。

(这通常 not 在 2017 年解决了问题,但现在通常 确实 似乎解决了问题 - 他们修复了一些问题。此外,您的 Dockerfile 似乎现在应该通常以“FROM ibmcom/swift-ubuntu”开头;以前您必须提供某个版本/dev-build 才能使其工作。)

【讨论】:

    【解决方案7】:

    我认为 touch 命令是正确的答案,例如做类似的事情

    touch --date="`date`" aclocal.m4 Makefile.am configure Makefile.in
    

    在 [./configure && make] 之前。

    侧边栏 I:否则,我同意 @kaz:为 aclocal.m4 和/或 configure 和/或 Makefile.am 和/或 Makefile.in 添加依赖项会假设目标系统可能无效。具体来说,这些假设是

    1) 所有目标系统都有自动工具,

    2) 所有目标系统都具有相同版本的自动工具(例如本例中的 automake.1.15)。

    3) 如果 (1) 或 (2) 对任何用户都不正确,则用户正在从维护者生成的 TAR 或 ZIP 格式中提取包,该格式维护相关文件的时间戳,在这种情况下,所有配置生成的 Makefile 中的 autotool/configure/Makefile.am/Makefile.in 依赖项将在 发出 make 命令之前得到满足。

    第二个假设在许多 Mac 系统上都失败了,因为 automake.1.14 是 OSX 的“最新”版本(至少我在 MacPorts 中看到的是这样,显然 brew 也是如此)。

    第三个假设在使用 Github 的世界中失败了。这种失败是“每个人都认为他们是规范的”心态的一个例子;具体来说,维护者是唯一类需要编辑 Makefile.am 的用户,现在已将每个人放入该类。

    也许 autowhatever 中有一个选项可以防止这些依赖项被添加到 Makefile.in 和/或 Makefile。

    侧边栏 II [为什么@kaz 是对的]:当然,对我和其他专家来说,很明显,只需尝试一系列 [touch] 命令来欺骗 configure 创建的 Makefile 重新运行 configure 和 autotools .但这不是配置的重点;配置的重点是确保尽可能多的不同系统上的用户可以简单地执行 [./configure && make] 并继续;大多数用户对“刮牦牛”不感兴趣,例如调试 autotools 开发人员的错误假设。

    侧边栏 III:可以说 ./configure,现在 autotools 添加了这些依赖项,是与 Github 分发包一起使用的错误构建工具。

    边栏 IV:也许基于配置的 Github 存储库应该将必要的触摸命令放入其自述文件中,例如https://github.com/drbitboy/Tycho2_SQLite_RTree.

    【讨论】:

      【解决方案8】:

      问题不是automake包,是repository

      sudo apt-get install automake

      安装版本aclocal-1.4,这就是你找不到1.5的原因(在Ubuntu 14,15中)

      使用此脚本安装最新版本 https://github.com/gp187/nginx-builder/blob/master/fix/aclocal.sh

      【讨论】:

        【解决方案9】:

        2017 - 高山脉

        在 Mac 上运行 autoconf 1.15 真的很难。我们聘请了一位专家来让它发挥作用。一切都很顺利。

        后来我碰巧将 Mac 升级到 High Sierra。

        Docker 管道停止工作!

        即使 autoconf 1.15 在 Mac 上运行良好。

        如何解决,

        简短的回答,我只是简单地丢弃了本地 repo,然后再次检查了 repo。

        此 QA 页面和其他地方的组合中都注明了此建议。

        然后它工作正常!

        这可能与 aclocal.m4 和类似文件有关。 (但谁知道真的)。我无休止地按摩那些文件......但什么都没有。

        出于某种未知原因,如果您只是刮擦您的 repo 并再次获取 repo:一切正常!

        我尝试了几个小时,每次触摸/删除等相关文件的组合,但没有。只需从头开始查看 repo!

        【讨论】:

        • 要将 automake repo 恢复到结帐状态,您可以执行以下操作:“make distclean”。
        • 技术上它不是一个 git 命令。这是在 ./configure 之后清理存储库。所以它是汽车制造的一部分。但它应该适用于任何使用 automake 的 git 存储库。
        • gotchya,听起来不错。
        • “在 Mac 上让 autoconf 1.15 工作真的很难。我们聘请了一位超级专家来让它工作......” - 这告诉我们这个工具链是多么的破碎是。可悲的是,20 多年来,它还没有得到修复。不修复它是我反对的事情。它有什么目的让它坏了,以至于人们不能使用它?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-25
        • 2015-11-20
        • 1970-01-01
        • 2022-12-09
        • 2017-02-28
        • 1970-01-01
        • 2020-12-04
        相关资源
        最近更新 更多