Makefile: 4: *** fehlendes Trennzeichen. Halt

474

Das ist mein Makefile:

all:ll

ll:ll.c   
  gcc  -c  -Wall -Werror -02 c.c ll.c  -o  ll  $@  $<

clean :
  \rm -fr ll

Wenn ich versuche make cleanoder make make, erhalte ich folgende Fehlermeldung:

:makefile:4: *** missing separator.  Stop.

Wie kann ich es reparieren?

Rahul Reddy
quelle
6
Sie können .RECIPEPREFIX verwenden, um die Zeichenverwendung zu ändern. Siehe: gnu.org/software/make/manual/html_node/…
aseq
2
Wie wurde das nicht als Duplikat geschlossen ??? Mögliches Duplikat von Make error: fehlendes Trennzeichen
jww
Stellen Sie im Abschnitt "Optionen -> Allgemein" sicher, dass "Gefälschte halbe Tabulatoren" vor dieser Option kein "X" in eckigen Klammern haben.
Jovan Ružić

Antworten:

992

makefile hat eine sehr dumme Beziehung zu Tabs, alle Aktionen jeder Regel werden durch Tabs identifiziert. Und nein, 4 Leerzeichen bilden keine Registerkarte, nur eine Registerkarte erstellt eine Registerkarte.

Zur Überprüfung benutze ich den Befehl cat -e -t -v makefile_name

Es zeigt, dass das Vorhandensein von Registerkarten mit ^Iund Zeilenenden mit $beiden von entscheidender Bedeutung sind, um sicherzustellen, dass Abhängigkeiten ordnungsgemäß enden, und Registerkarten markieren die Aktion für die Regeln, damit sie für das Dienstprogramm make leicht identifizierbar sind.

Beispiel:

Kaizen ~/so_test $ cat -e -t -v  mk.t
all:ll$      ## here the $ is end of line ...                   
$
ll:ll.c   $
^Igcc  -c  -Wall -Werror -02 c.c ll.c  -o  ll  $@  $<$ 
## the ^I above means a tab was there before the action part, so this line is ok .
 $
clean :$
   \rm -fr ll$
## see here there is no ^I which means , tab is not present .... 
## in this case you need to open the file again and edit/ensure a tab 
## starts the action part
Nitin
quelle
8
"cat -e -t -v makefile_name" ist das Beste. Je. Ich starrte weiter auf den Bildschirm und sah, was wie ein Tab aussah. Es fehlte mir völlig, dass es die EINE LINIE in der gesamten Datei war, die Leerzeichen anstelle eines harten Tabs verwendete.
Arinmorf
Ich danke dir sehr! Ich habe den Quellcode eines großen Projekts kompiliert. Fügte einige Zeilen makefileaus dem Tutorial ein, und es funktionierte nicht. Erst nach dem Löschen von Leerzeichen und dem Putten hat es Tabfunktioniert!
Rzaaeeff
Achten Sie beim Kopieren / Einfügen von einem Makefile in ein anderes mit dem vi (oder vim) -Editor darauf, dass Sie nicht versehentlich die Zeile ~ (Tilde) greifen, die das Dateiende angibt. Ein echtes ~ sieht aus wie ein vi-Marker und verursacht das "*** fehlende Trennzeichen. Stop". Error. Dies mag offensichtlich erscheinen, aber wenn es versehentlich passiert, ist es alles andere als offensichtlich. Weitere Informationen finden Sie in meinem Blog-Kommentar .
Scott
3
-vOption für catBefehl ist hier überflüssig, weil -eMittel -vEund -tMittel -vT.
xxks-kkk
2
Hier ist ein Tabulatorzeichen. Wenn jemand einen Editor verwendet, der Tabulatoren ersetzt, kopieren Sie ihn und fügen Sie ihn hier ein :.
Ivan Borshchov
32

Klicken Sie in VS Code einfach auf "Leerzeichen: 4" in der rechten Ecke und ändern Sie es in die Registerkarte, wenn Sie Ihr Makefile bearbeiten.

alanwsx
quelle
1
Ich habe das dort unten nicht einmal bemerkt - danke für diese Info. Ich habe vorher einen Regex-Find-Replace verwendet, aber das ist viel schöner.
Erdnuss
VS Code erkannte, dass meine 'common.mk'-Datei, die aus einem' Makefile 'ohne Suffix extrahiert wurde, eine make-Datei war, und hob sie korrekt hervor - begann jedoch leise mit Leerzeichen anstelle von Tabulatoren einzurücken.
Francis Norton
Danke für die Hilfe! Ich habe definitiv nicht bemerkt, dass es in dieser unteren Ecke Registerkarteneinstellungen gibt.
se_brandon
28

Sie sollten den Befehl immer nach a schreiben Tab Leerzeichen und nicht Leerzeichen .

Dies gilt gccin Ihrem Fall für Zeile (Zeile 4). Sie müssen vorher eine Registerkarte einfügen gcc.

Ersetzen Sie auch \rm -fr lldurch rm -fr ll. Fügen Sie vor diesem Befehl auch Registerkarten ein.

Denny Mathew
quelle
3
Um ganz klar zu sein, muss in jeder logischen Rezeptzeile ein hartes TAB-Zeichen als erstes Zeichen vorhanden sein. Nach dem TAB können Sie beliebige Leerzeichen hinzufügen.
MadScientist
sollte der Tabulator gleich 2 oder 4 sein? in /.vimrc tabstop = 2 oder 4 setzen?
Rahul Reddy
@RahulReddy, wie ein Editor eine Registerkarte anzeigt, hat nichts damit zu tun, ob die Konfiguration ein Tabulatorzeichen enthält oder nicht.
Xaxxon
Toller Tipp, weil ich vorne Platz hatte. Als ich nachgesehen habe, hat es funktioniert. Hervorragend :)
Indianwebdevil
9

Die Lösung für PyCharmwäre, ein Makefile supportPlugin zu installieren :

  1. Öffnen Preferences(cmd + , )
  2. Gehe zu Plugins->Marketplace
  3. Suchen Sie nach Makefile supportder IDE, installieren Sie sie und starten Sie sie neu.

Dies sollte das Problem beheben und eine Syntax für ein Makefile bereitstellen.

Tomasz Bartkowiak
quelle
Dies hilft auch in GoLand
Vizjerei
Ich finde IDE wirklich wichtig. Die Tab-Edition wird in pycharm nicht unterstützt. Wenn ich zu ATOM wechsle, funktioniert die TAB-Eingabe.
Moonlight Knight
6

Es ist eine ziemlich alte Frage, aber ich möchte noch etwas über eine weitere Option mit dem vi/vimEditor zur Visualisierung der Registerkarten sagen . Wenn Sie vi/viminstalliert haben , öffnen Sie ein Makefile(zB vim Makefile) und geben Sie ein :set list. Dies zeigt die Anzahl der wie unten eingefügten Registerkarten an.

 %-linux: force$
^I@if [ "$(GCC_VERSION)" = "2.96" ] ; then \$
^I^Iecho ===== Generating build tree for legacy $@ architecture =====; \$
^I^I$(CONFIGURE) $(CWD) $@ legacy; \$
^Ielse \$
^I^Iecho ===== Generating build tree for $@ architecture =====; \$
^I^I$(CONFIGURE) $(CWD) $@; \$
^Ifi$
^Icd build-$@;make$
Panch
quelle
6

Verwenden Sie .editorconfig, um die Registerkarten automatisch zu reparieren:

root = true

[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 4

[Makefile]
indent_style = tab
Daniel W.
quelle
4

Der entscheidende Punkt war "HARD TAB". 1. Überprüfen Sie, ob Sie TAB anstelle von Leerzeichen verwendet haben. 2. Überprüfen Sie Ihre .vimrc auf "set tabstop = X".

wlsherica
quelle
2

Wenn jemand von Ihnen ein Produkt von Intellij verwendet, ist die Lösung dafür folgende:

  1. Gehen Sie zu Einstellungen> Editor> Codestil
  2. Hier müssen Sie den Dateityp auswählen, der zu Ihrem Problem gehört. Aber höchstwahrscheinlich müssen Sie auswählen Other File Types.
  3. In der Registerkarte geöffnet markieren Sie das Kontrollkästchen für Use tab characterund vorsichtig sein, Tab sizeund IndentWerte müssen 4 sein.
Bogdan Alexandru Militaru
quelle
2

Wenn Sie mcedit für die Makefile-Bearbeitung verwenden. Sie müssen die folgende Markierung sehen. Geben Sie hier die Bildbeschreibung ein

Riguang Zheng
quelle
0

Dies liegt daran, dass die Registerkarte durch Leerzeichen ersetzt wird. Um diese Funktion zu deaktivieren, gehen Sie zu

gedit-> edit-> Einstellungen-> editor

und entfernen Sie die Prüfung auf

" Tab durch Leerzeichen ersetzen "

Shrinivas Patgar
quelle