Errore: separatore mancante


Risposte:


364

Come indicato nel manuale online , la causa più comune di tale errore è che le righe sono rientrate di spazi quando makesi prevedono caratteri di tabulazione.

Corretta

target: 
\tcmd

dove \tè TAB (U + 0009)

Sbagliato

target:
....cmd

dove ognuno .rappresenta uno SPAZIO (U + 0020).


4
Puoi usare .RECIPEPREFIX per cambiare il carattere che usa. Vedi: gnu.org/software/make/manual/html_node/…
aseq,

16

Solo per sorridere, e nel caso in cui qualcun altro incontri un errore simile:

Ho ricevuto il famigerato errore "separatore mancante" perché avevo invocato una regola che definisce una funzione come

($eval $(call function,args))

piuttosto che

$(eval $(call function,args))

cioè ($piuttosto che $(.


Che cosa? :) Immagino che non avessi 0x20"spazio" lì, è corretto?
user35443

3
@ user35443 Il posizionamento di$
smac89

8

Questo è un errore di sintassi nel tuo Makefile. È abbastanza difficile essere più specifici di così, senza vedere il file stesso o le relative parti.


5

Per me, il problema era che avevo alcuni # ...commenti di fine riga incorporati in una define ... endefdefinizione di variabile multilinea. La rimozione dei commenti ha fatto scomparire il problema.


Grazie. Non sapevo che i commenti nella definedirettiva fossero trattati alla lettera. In realtà il comportamento non è spiegato nella documentazione . (Per chiarezza: l'incorporazione di un segno numerico #all'interno della direttiva non è di per sé un errore di sintassi. Ma non è semplicemente interpretato come l'inizio di un commento, quindi è ammesso che sia soggetto a errori.)
ynn

3

Il mio errore era su una riga di dichiarazione variabile con un'estensione a più righe. Ho uno spazio finale dopo il "\" che ha reso una continuazione di riga non valida.

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

1

Nel mio caso l'errore ha causato il prossimo. Ho cercato di eseguire comandi a livello globale, cioè al di fuori di qualsiasi target.

UPD. Per eseguire il comando a livello globale è necessario formarsi correttamente. Ad esempio comando

ln -sf ../../user/curl/$SRC_NAME ./$SRC_NAME

potrebbe diventare:

$(shell ln -sf ../../user/curl/$(SRC_NAME) ./$(SRC_NAME))

1

Nel mio caso, lo stesso errore è stato causato perché i due punti :mancavano alla fine come in staging.deploy:. Quindi nota che può essere un semplice errore di sintassi.


1

Nel mio caso, in realtà mi mancava una scheda in mezzo ifeqe il comando nella riga successiva. All'inizio non c'erano spazi.

ifeq ($(wildcard $DIR_FILE), )
cd $FOLDER; cp -f $DIR_FILE.tpl $DIR_FILE.xs;
endif

Avrebbe dovuto essere:

ifeq ($(wildcard $DIR_FILE), )
<tab>cd $FOLDER; cp -f $DIR_FILE.tpl $DIR_FILE.xs;
endif

Nota che <tab>è un vero carattere di tabulazione


0

Nel mio caso, questo errore è stato causato dalla mancanza di un mero spazio. Ho avuto questo blocco nel mio makefile:

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

che avrebbe dovuto essere:

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

con uno spazio dopo se.



-1

Quindi a quanto pare, tutto ciò di cui avevo bisogno era il pacchetto "build-essential", quindi eseguire autoconfprima, che ha reso il Makefile.pre.in, ./configurepoi il makeche funziona perfettamente ...


-2

Il seguente codice Makefile ha funzionato:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.