Popełnij błąd: brak separatora


Odpowiedzi:


364

Jak wskazano w podręczniku online , najczęstszą przyczyną tego błędu jest wcięcie wierszy spacjami, gdy makeoczekiwane są znaki tabulacji.

Poprawny

target: 
\tcmd

gdzie \tjest TAB (U + 0009)

Źle

target:
....cmd

gdzie każdy .reprezentuje SPACJĘ (U + 0020).


4
Możesz użyć .RECIPEPREFIX, aby zmienić sposób użycia postaci. Zobacz: gnu.org/software/make/manual/html_node/…
aseq

16

Tylko dla uśmiechu i na wypadek, gdyby ktoś popełnił podobny błąd:

Dostałem niesławny błąd „brakującego separatora”, ponieważ wywołałem regułę definiującą funkcję jako

($eval $(call function,args))

zamiast

$(eval $(call function,args))

tzn. ($raczej niż $(.


Co? :) Chyba nie było tam 0x20„spacji”, prawda?
user35443

3
@ user35443 Umieszczenie$
smac89

8

To jest błąd składniowy w twoim Makefile. Trudno jest być bardziej szczegółowym, nie widząc samego pliku ani jego odpowiedniej części.


5

Dla mnie problem polegał na tym, że miałem # ...komentarze na końcu wiersza osadzone w define ... endefdefinicji zmiennej wieloliniowej. Usunięcie komentarzy sprawiło, że problem zniknął.


Dziękuję Ci. Nie wiedziałem, że komentarze w definedyrektywie są traktowane dosłownie. W rzeczywistości zachowanie nie zostało wyjaśnione w dokumentacji . (Dla jasności: Osadzanie znak numeru #. W ramach dyrektywy sama nie jest błąd składni Ale to nie jest po prostu interpretować jako początek komentarza, więc robi to wprawdzie podatne na błędy.)
ynn

3

Mój błąd dotyczył zmiennej linii deklaracji z rozszerzeniem wieloliniowym. Mam spację po znaku „\”, co spowodowało, że niepoprawna kontynuacja linii.

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

1

W moim przypadku błąd spowodował następny. Próbowałem wykonywać polecenia globalnie, tzn. Poza jakimkolwiek celem.

UPD. Aby uruchomić komendę globalnie, trzeba być odpowiednio uformowanym. Na przykład polecenie

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

stanie się:

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

1

W moim przypadku ten sam błąd został spowodowany, ponieważ :na końcu brakowało okrężnicy jak w staging.deploy:. Pamiętaj, że może to być łatwy błąd w składni.


1

W moim przypadku faktycznie brakowało mi tabulatora pomiędzy ifeqi polecenia w następnym wierszu. Na początku nie było spacji.

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

Powinien był być:

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

Uwaga: <tab>to rzeczywisty znak tabulacji


0

W moim przypadku ten błąd był spowodowany brakiem jedynie spacji. Miałem to, jeśli blok w moim makefile:

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

który powinien być:

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

ze spacją po if.



-1

Najwyraźniej wszystko, czego potrzebowałem, to pakiet „niezbędny do kompilacji”, a następnie autoconfnajpierw uruchomić , który stworzył Makefile.pre.in, a ./configurepotem ten, makektóry działa idealnie ...


-2

Działa następujący kod Makefile:

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.