Ich erhalte folgenden Fehler make
:
Makefile:168: *** missing separator. Stop.
Was verursacht das?
Ich erhalte folgenden Fehler make
:
Makefile:168: *** missing separator. Stop.
Was verursacht das?
Antworten:
Wie im Online-Handbuch angegeben , besteht die häufigste Ursache für diesen Fehler darin, dass Zeilen mit Leerzeichen eingerückt werden, wenn make
Tabulatorzeichen erwartet werden.
target:
\tcmd
wo \t
ist TAB (U + 0009)
target:
....cmd
wobei jedes .
ein Leerzeichen darstellt (U + 0020).
Nur zum Grinsen und für den Fall, dass jemand anderes auf einen ähnlichen Fehler stößt:
Ich habe den berüchtigten Fehler "fehlendes Trennzeichen" erhalten, weil ich eine Regel aufgerufen hatte, die eine Funktion als definiert
($eval $(call function,args))
eher, als
$(eval $(call function,args))
dh ($
eher als $(
.
0x20
"Platz", ist das richtig?
$
Dies ist ein Syntaxfehler in Ihrem Makefile. Es ist ziemlich schwierig, genauer zu sein, ohne die Datei selbst oder relevante Teile davon zu sehen.
Für mich bestand das Problem darin, dass ich einige Zeilenende- # ...
Kommentare in eine define ... endef
mehrzeilige Variablendefinition eingebettet hatte . Durch das Entfernen der Kommentare wurde das Problem behoben.
define
Richtlinie wörtlich behandelt werden. Eigentlich wird das Verhalten in der Dokumentation nicht erklärt . (Aus Gründen der Klarheit: Das Einbetten eines Zahlenzeichens in die Direktive selbst ist kein Syntaxfehler. Es wird jedoch nicht als Beginn eines Kommentars interpretiert, daher ist dies zugegebenermaßen fehleranfällig.)#
In meinem Fall Fehler als nächstes verursacht. Ich habe versucht, Befehle global auszuführen, dh außerhalb eines Ziels.
UPD. Um einen Befehl global ausführen zu können, muss er ordnungsgemäß gebildet sein. Zum Beispiel Befehl
ln -sf ../../user/curl/$SRC_NAME ./$SRC_NAME
würde werden:
$(shell ln -sf ../../user/curl/$(SRC_NAME) ./$(SRC_NAME))
In meinem Fall fehlte mir tatsächlich eine Registerkarte dazwischen ifeq
und der Befehl in der nächsten Zeile. Anfangs gab es keine Leerzeichen.
ifeq ($(wildcard $DIR_FILE), )
cd $FOLDER; cp -f $DIR_FILE.tpl $DIR_FILE.xs;
endif
Gewesen sein sollte:
ifeq ($(wildcard $DIR_FILE), )
<tab>cd $FOLDER; cp -f $DIR_FILE.tpl $DIR_FILE.xs;
endif
Beachten Sie, dass dies <tab>
ein tatsächliches Tabulatorzeichen ist
Ich hatte die fehlende Trenndatei in Makefiles von qmake generiert. Ich habe Qt-Code auf eine andere Plattform portiert. Ich hatte weder QMAKESPEC noch MAKE eingestellt. Hier ist der Link, auf den ich die Antwort gefunden habe:
https://forum.qt.io/topic/3783/missing-separator-error-in-makefile/5
Alles, was ich anscheinend brauchte, war das "Build-Essential" -Paket, um dann zuerst zu laufen autoconf
, was das machte Makefile.pre.in
, dann das, was ./configure
dann make
perfekt funktioniert ...
Der folgende Makefile-Code hat funktioniert:
obj-m = hello.o
all:
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean