Pojawia się następujący błąd make
:
Makefile:168: *** missing separator. Stop.
Co to powoduje?
Pojawia się następujący błąd make
:
Makefile:168: *** missing separator. Stop.
Co to powoduje?
Odpowiedzi:
Jak wskazano w podręczniku online , najczęstszą przyczyną tego błędu jest wcięcie wierszy spacjami, gdy make
oczekiwane są znaki tabulacji.
target:
\tcmd
gdzie \t
jest TAB (U + 0009)
target:
....cmd
gdzie każdy .
reprezentuje SPACJĘ (U + 0020).
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ż $(
.
0x20
„spacji”, prawda?
$
Dla mnie problem polegał na tym, że miałem # ...
komentarze na końcu wiersza osadzone w define ... endef
definicji zmiennej wieloliniowej. Usunięcie komentarzy sprawiło, że problem zniknął.
define
dyrektywie 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.)
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))
W moim przypadku faktycznie brakowało mi tabulatora pomiędzy ifeq
i 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
Miałem brakujący plik separatora w Makefiles wygenerowany przez qmake. Przenosiłem kod Qt na inną platformę. Nie miałem zestawu QMAKESPEC ani MAKE. Oto link, na który znalazłem odpowiedź:
https://forum.qt.io/topic/3783/missing-separator-error-in-makefile/5
Najwyraźniej wszystko, czego potrzebowałem, to pakiet „niezbędny do kompilacji”, a następnie autoconf
najpierw uruchomić , który stworzył Makefile.pre.in
, a ./configure
potem ten, make
który działa idealnie ...
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