Fehler machen: fehlendes Trennzeichen


Antworten:


363

Wie im Online-Handbuch angegeben , besteht die häufigste Ursache für diesen Fehler darin, dass Zeilen mit Leerzeichen eingerückt werden, wenn makeTabulatorzeichen erwartet werden.

Richtig

target: 
\tcmd

wo \tist TAB (U + 0009)

Falsch

target:
....cmd

wobei jedes .ein Leerzeichen darstellt (U + 0020).


4
Sie können .RECIPEPREFIX verwenden, um die Zeichenverwendung zu ändern. Siehe: gnu.org/software/make/manual/html_node/…
aseq

16

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 $(.


Was? :) Ich denke du hattest dort keinen 0x20"Platz", ist das richtig?
user35443

3
@ user35443 Die Platzierung von$
smac89

8

Dies ist ein Syntaxfehler in Ihrem Makefile. Es ist ziemlich schwierig, genauer zu sein, ohne die Datei selbst oder relevante Teile davon zu sehen.


5

Für mich bestand das Problem darin, dass ich einige Zeilenende- # ...Kommentare in eine define ... endefmehrzeilige Variablendefinition eingebettet hatte . Durch das Entfernen der Kommentare wurde das Problem behoben.


Danke dir. Ich wusste nicht, dass Kommentare in der defineRichtlinie 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.)#
ynn

3

Mein Fehler war in einer Variablendeklarationszeile mit einer mehrzeiligen Erweiterung. Ich habe ein nachgestelltes Leerzeichen nach dem "\", was dies zu einer ungültigen Zeilenfortsetzung machte.

MY_VAR = \
   val1 \ <-- 0x20 there caused the error.
   val2

1

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))

1

In meinem Fall wurde der gleiche Fehler verursacht, weil :am Ende der Doppelpunkt fehlte wie in staging.deploy:. Beachten Sie also, dass es leicht zu Syntaxfehlern kommen kann.


1

In meinem Fall fehlte mir tatsächlich eine Registerkarte dazwischen ifeqund 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


0

In meinem Fall wurde dieser Fehler durch das Fehlen eines Platzes verursacht. Ich hatte diesen if-Block in meinem Makefile:

if($(METHOD),opt)
CFLAGS=
endif

was hätte sein sollen:

if ($(METHOD),opt)
CFLAGS=
endif

mit einem Leerzeichen nach if.



-1

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 ./configuredann makeperfekt funktioniert ...


-2

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