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?


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

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.


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.


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.


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$

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

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".


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.

2

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


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 "

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.