Ich versuche ein C ++ - Programm auf Github auszuführen. (verfügbar unter folgendem Link https://github.com/mortehu/text-classifier )
Ich habe einen Mac und versuche ihn im Terminal auszuführen. Ich glaube, ich habe autoconf und automake heruntergeladen, bin mir aber nicht sicher. Um das Programm auszuführen, gehe ich in den richtigen Ordner im Terminal und laufe dann
./configure && make
Aber ich bekomme den Fehler:
WARNUNG: 'aclocal-1.15' fehlt auf Ihrem System. Sie sollten es nur benötigen, wenn Sie die in 'configure.ac' enthaltenen Dateien 'acinclude.m4' oder 'configure.ac' oder m4 geändert haben. Das 'aclocal'-Programm ist Teil des GNU Automake-Pakets: http://www.gnu.org/software/automake Zum Ausführen sind außerdem GNU Autoconf, GNU m4 und Perl erforderlich: http://www.gnu.org / software / autoconf http://www.gnu.org/software/m4/ http://www.perl.org/ make: *** [aclocal.m4] Fehler 127
Ich habe xcode und g ++ und alle Dinge, die zum Ausführen von c-Programmen erforderlich sind, aber wie es wahrscheinlich offensichtlich ist, habe ich keine Ahnung, was ich tue.
Was ist der einfachste und einfachste Weg, um das Programm über den obigen Link auszuführen? Mir ist klar, dass es eine Readme-Datei und eine Beispielverwendung gibt, aber ich kann das nicht zum Laufen bringen.
automake
,autoconf
,m4
, undperl
, wie die Botschaft ganz klar sagt ... „Ich denke , ich habe autoconf und automake, bin mir aber nicht sicher "- Ich bin mir ziemlich sicher, dass Sie es zumindest nicht richtig installiert haben . ;-)Antworten:
./configure
Versuchen Sie vor dem Laufen zu laufenautoreconf -f -i
. Das Autoreconf-Programm führt nach Bedarf automatisch Autoheader, Aclocal, Automake, Autopoint und Libtoolize aus.Zum Hinzufügen bearbeiten: Dies wird normalerweise durch das Auschecken von Code aus Git verursacht, anstatt ihn aus einem
.zip
oder einem.tar.gz
Archiv zu extrahieren . Um beim Erstellen von Dateien Neuerstellungen auszulösen, behält Git die Zeitstempel der Dateien nicht bei, sodass dasconfigure
Skript möglicherweise veraltet zu sein scheint. Wie andere bereits erwähnt haben, gibt es Möglichkeiten, dies zu umgehen, wenn Sie nicht über eine ausreichend aktuelle Version von verfügenautoreconf
.Eine weitere Änderung: Dieser Fehler kann auch durch Kopieren des aus einem Archiv mit scp extrahierten Quellordners auf einen anderen Computer verursacht werden. Die Zeitstempel können aktualisiert werden, was darauf hindeutet, dass eine Neuerstellung erforderlich ist. Um dies zu vermeiden, kopieren Sie das Archiv und extrahieren Sie es an Ort und Stelle.
quelle
tools/text-classifier/text-classifier
. Ich weiß nicht warummake install
nicht funktioniert.automake
Paket aktualisierenOft brauchen Sie keine
auto*
Werkzeuge und die einfachste Lösung ist, einfach laufentouch aclocal.m4 configure
im entsprechenden Ordner (und auch laufentouch
aufMakefile.am
undMakefile.in
wenn sie vorhanden sind ). Dadurch wird der Zeitstempel desaclocal.m4
Systems aktualisiert und daran erinnert, dassaclocal.m4
es auf dem neuesten Stand ist und nicht neu erstellt werden muss. Danach ist es wahrscheinlich am besten, dasbuild
Verzeichnis zu leeren und danach erneut zu startenconfigure
. Ich stoße regelmäßig auf dieses Problem. Für mich ist die Hauptursache, dass ich eine Bibliothek (z. B.mpfr
Code fürgcc
) aus einem anderen Ordner kopiere und die Zeitstempel sich ändern.Natürlich ist dieser Trick nicht gültig, wenn Sie diese Dateien wirklich neu generieren müssen, möglicherweise weil Sie sie manuell geändert haben. Hoffentlich verteilen die Entwickler des Pakets aktuelle Dateien.
Und wenn Sie
automake
und Freunde installieren möchten, verwenden Sie natürlich den entsprechenden Paket-Manager für Ihre Distribution.Installieren Sie aclocal, das mit automake geliefert wird:
brew install automake # for Mac apt-get install automake # for Ubuntu
Versuchen Sie es nochmal:
quelle
brew install libtool
, und führen Sieaclocal
dann ausautoconf
.Sie können die benötigte Version einfach installieren:
Zuerst Quelle erhalten:
$ wget https://ftp.gnu.org/gnu/automake/automake-1.15.tar.gz
Pack es aus:
$ tar -xzvf automake-1.15.tar.gz
Erstellen und installieren:
$ cd automake-1.15 $ ./configure --prefix=/opt/aclocal-1.15 $ make $ sudo mkdir -p /opt $ sudo make install
Benutze es:
$ export PATH=/opt/aclocal-1.15/bin:$PATH $ aclocal --version
aclocal (GNU automake) 1.15
Wenn jetzt aclocal aufgerufen wird, erhalten Sie die richtige Version.
quelle
Eine generische Antwort, die für diesen speziellen Fall gelten kann oder nicht:
Wie die Fehlermeldung andeutet, sollte aclocal-1.15 nur erforderlich sein, wenn Sie Dateien geändert haben, die zum Generieren von aclocal.m4 verwendet wurden
Wenn Sie keine dieser Dateien (einschließlich configure.ac) ändern, sollten Sie aclocal-1.15 nicht benötigen.
In meinem Fall bestand das Problem nicht darin, dass eine dieser Dateien geändert wurde, aber irgendwie war der Zeitstempel auf configure.ac 6 Minuten später im Vergleich zu aclocal.m4.
Ich habe nicht herausgefunden warum, aber ein sauberer Klon meines Git Repo hat das Problem für mich gelöst. Vielleicht etwas, das mit Git zu tun hat und wie es überhaupt Dateien erstellt hat.
Anstatt Autoconf und Freunde erneut auszuführen, würde ich einfach versuchen, einen sauberen Klon zu erhalten und es erneut zu versuchen .
Es ist auch möglich, dass jemand eine Änderung an configure.ac vorgenommen hat, aber aclocal.m4 nicht neu generiert hat. In diesem Fall müssen Sie tatsächlich automake und friends erneut ausführen.
quelle
rsync
die bereits extrahierten Dateien von einem Server auf einen anderen kopiert (anstatt die komprimierten Quellarchive zu kopieren), ohne die Zeitstempel beizubehalten. Als ich stattdessen die Quellarchive kopierte und auf dem Zielcomputer extrahierte, trat das Problem nicht auf. Vielen Dank!Der Sinn von Autotools besteht darin, eine arkane M4-Makro-basierte Sprache bereitzustellen, die letztendlich zu einem Shell-Skript namens kompiliert wird
./configure
. Sie können dieses kompilierte Shell-Skript mit dem Quellcode versenden. Dieses Skript sollte alles tun, um die Umgebung zu erkennen und das Programm für die Erstellung vorzubereiten. Autotools sollten nur von jemandem benötigt werden, der die Tests optimieren und das Shell-Skript aktualisieren möchte.Es besiegt den Punkt von Autotools, wenn GNU This und GNU That auf dem System installiert sein müssen, damit es funktioniert. Ursprünglich wurde es erfunden, um die Portierung von Programmen auf verschiedene Unix-Systeme zu vereinfachen, auf die man sich nicht verlassen konnte. Sogar die Konstrukte, die vom generierten Shell-Code in verwendet wurden,
./configure
mussten sehr sorgfältig ausgewählt werden, um sicherzustellen, dass sie auf jeder kaputten alten Shell fast überall funktionieren.Das Problem, auf das Sie stoßen, ist auf einige fehlerhafte Makefile-Schritte zurückzuführen, die von Leuten erfunden wurden, die einfach nicht verstehen, wofür Autotools gedacht sind und welche Rolle das endgültige
./configure
Skript spielt.Um dieses Problem zu umgehen, können Sie in das Makefile gehen und einige Änderungen vornehmen, um dies aus dem Weg zu räumen. Als Beispiel baue ich den Git-Kopf von GNU Awk und stoße auf dasselbe Problem. Ich habe diesen Patch
Makefile.in
jedoch angewendet und kann erfolgreichmake 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@
Grundsätzlich habe ich die Dinge so geändert, dass der harmlose
true
Shell-Befehl alle Auto-Stuff-Programme ersetzt.Die eigentlichen Build-Schritte für Gawk benötigen kein Auto-Zeug! Es ist nur an einigen Regeln beteiligt, die aufgerufen werden, wenn Teile des Auto-Materials geändert wurden und erneut verarbeitet werden müssen. Das Makefile ist jedoch so strukturiert, dass es fehlschlägt, wenn die Tools nicht vorhanden sind.
Vor dem obigen Patch:
$ ./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
Nach dem Patch:
$ ./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. [...]
Na, bitte. Wie Sie sehen können,
CDPATH=
befinden sich in den Befehlszeilen dort, wo das Auto-Zeug aufgerufen wurde, dietrue
Befehle. Diese melden eine erfolgreiche Beendigung, und so fällt es einfach durch diesen Müll, um den verdammten Build auszuführen, der perfekt konfiguriert ist.Ich habe
make gawk
es getan, weil einige Unterverzeichnisse erstellt werden, die fehlschlagen. Der Trick muss für die jeweiligen Makefiles wiederholt werden.Wenn Sie auf solche Dinge mit einem makellosen, offiziellen Tarball des Programms von seinen Entwicklern stoßen, dann beschweren Sie sich. Es sollte nur auspacken,
./configure
undmake
ohne dass Sie etwas zu flicken oder irgendwelche Automake- oder Autoconf Materialien zu installieren.Idealerweise sollte sich auch ein Ziehen des Git-Kopfes so verhalten.
quelle
touch
Sie sie ändern). Zu sagen, dass die Personen, die dieses System erstellt haben, nicht verstehen, wofür es erstellt wurde (um sicherzustellen, dass Sie mit allen Abhängigkeiten korrekt erstellen - einschließlich derauto*
Teile, wenn sie geändert werden) und die Makefiles zu ändern, um dies effektiv nicht vollständig zu tun mehr scheint ... falsch.true
. Wenn Sie die defekten Teile wirklich reparieren möchten, "nur weil die Zeitstempel" bessermake --touch
gegen die fehlerhaften Ziele laufen (wenn Sie sie sammeln möchten, führen Sie sie ausmake --keep-going
, um vorher eine Liste der "defekten" Teile zu erhalten).true
rational gerechtfertigt, da diese Tools nicht zum Erstellen des Programms erforderlich sind, sondern nur zum erneuten Erstellen desconfigure
Skripts, das bereits in vorgefertigter Form verfügbar ist. Durch Berühren der Zeitstempel, um Versuche zu unterdrücken, die Werkzeuge auszuführen, wird der gleiche Effekt erzielt.Ich denke, der Touch-Befehl ist die richtige Antwort, zB etwas wie
touch --date="`date`" aclocal.m4 Makefile.am configure Makefile.in
vor [./configure && make].
Seitenleiste I: Ansonsten stimme ich @kaz zu: Durch Hinzufügen von Abhängigkeiten für aclocal.m4 und / oder configure und / oder Makefile.am und / oder Makefile.in werden Annahmen über das Zielsystem getroffen, die möglicherweise ungültig sind. Insbesondere sind diese Annahmen
1) dass alle Zielsysteme Autotools haben,
2) dass alle Zielsysteme dieselbe Version von Autotools haben (z. B. automake.1.15 in diesem Fall).
3) Wenn entweder (1) oder (2) für keinen Benutzer zutreffen, extrahiert der Benutzer das Paket aus einem vom Betreuer erstellten TAR- oder ZIP-Format, das die Zeitstempel der relevanten Dateien verwaltet. In diesem Fall werden alle Autotools / Konfigurationen durchgeführt /Makefile.am/Makefile.in Abhängigkeiten im konfigurierten Makefile werden erfüllt, bevor der Befehl make ausgegeben wird.
Die zweite Annahme schlägt auf vielen Mac-Systemen fehl, da automake.1.14 das "neueste" für OSX ist (zumindest sehe ich das in MacPorts, und anscheinend gilt das Gleiche für das Brauen).
Die dritte Annahme scheitert spektakulär in einer Welt mit Github. Dieses Versagen ist ein Beispiel für eine Denkweise, bei der "jeder denkt, er sei normativ". Insbesondere die Betreuer, die die einzige Benutzerklasse sind, die Makefile.am bearbeiten muss, haben jetzt alle in diese Klasse eingeordnet .
Möglicherweise gibt es in autowhatever eine Option, die verhindert, dass diese Abhängigkeiten zu Makefile.in und / oder Makefile hinzugefügt werden.
Sidebar II [Warum @kaz richtig ist]: Natürlich ist es für mich und andere Cognoscenti offensichtlich, einfach eine Folge von [touch] -Befehlen auszuprobieren, um das von configure erstellte Makefile davon abzuhalten, configure und die Autotools erneut auszuführen. Aber das ist nicht der Punkt der Konfiguration; Der Zweck der Konfiguration besteht darin, sicherzustellen, dass so viele Benutzer auf so vielen verschiedenen Systemen wie möglich einfach [./configure && make] ausführen und fortfahren können. Die meisten Benutzer sind nicht daran interessiert, das Yak zu rasieren, z. B. fehlerhafte Annahmen der Autotool-Entwickler zu debuggen.
Seitenleiste III: Es könnte argumentiert werden, dass ./configure, nachdem Autotools diese Abhängigkeiten hinzugefügt hat, das falsche Build-Tool für Github-verteilte Pakete ist.
Seitenleiste IV: Möglicherweise sollten konfigurationsbasierte Github-Repos den erforderlichen Touch-Befehl in ihre Readme-Datei aufnehmen, z . B. https://github.com/drbitboy/Tycho2_SQLite_RTree .
quelle
2018, noch eine Lösung ...
https://github.com/apereo/mod_auth_cas/issues/97
in einigen Fällen einfach laufen
und sonst nichts .... löst das Problem.
Das machen Sie im Verzeichnis
/pcre2-10.30
.Was ein Alptraum.
(Diese Regel hat nicht das Problem lösen , im Jahr 2017, aber jetzt in der Regel nicht scheint , das Problem zu lösen - sie etwas befestigt Auch scheint es , Ihre Dockerfile sollten jetzt in der Regel beginnen mit „FROM IBMCOM / swift-ubuntu“, vorher mußte man geben. eine bestimmte Version / dev-build, damit es funktioniert.)
quelle
Das Problem ist nicht
automake
Paket, ist das Repositorysudo apt-get install automake
Installiert die Version
aclocal-1.4
, deshalb können Sie sie nicht finden1.5
(In Ubuntu 14,15)Verwenden Sie dieses Skript, um die neueste Version von https://github.com/gp187/nginx-builder/blob/master/fix/aclocal.sh zu installieren
quelle
2017 - Hohe Sierra
Es ist wirklich schwierig, autoconf 1.15 auf einem Mac zum Laufen zu bringen. Wir haben einen Experten beauftragt, damit es funktioniert. Alles hat wunderbar funktioniert.
Später habe ich zufällig einen Mac auf High Sierra aktualisiert.
Die Docker-Pipeline funktioniert nicht mehr!
Auch wenn autoconf 1.15 ist gut funktioniert auf dem Mac.
Wie repariert man,
Kurze Antwort, ich habe einfach das lokale Repo verworfen und das Repo erneut ausgecheckt.
Dieser Vorschlag ist in der Mischung auf dieser QS-Seite und an anderer Stelle vermerkt.
Es hat dann gut funktioniert!
Es hat wahrscheinlich etwas mit aclocal.m4 und ähnlichen Dateien zu tun . (Aber wer weiß das wirklich). Ich habe diese Dateien endlos massiert ... aber nichts.
Aus irgendeinem unbekannten Grund, wenn Sie nur Ihr Repo kratzen und das Repo wieder erhalten: alles funktioniert!
Ich habe stundenlang jede Kombination aus Berühren / Löschen usw. usw. der fraglichen Dateien versucht, aber nein. Schauen Sie sich das Repo einfach von Grund auf an!
quelle