makefile: 4: *** brak separatora. Zatrzymać


473

To jest mój makefile:

all:ll

ll:ll.c   
  gcc  -c  -Wall -Werror -02 c.c ll.c  -o  ll  $@  $<

clean :
  \rm -fr ll

Kiedy próbuję make cleanlubmake make pojawia się ten błąd:

:makefile:4: *** missing separator.  Stop.

Jak mogę to naprawić?


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

2
Jak to nie zostało zamknięte jako duplikat? Możliwy duplikat
Popełnij

W menu „Opcje -> Ogólne” upewnij się, że „Fałszywe pół-zakładki” nie mają „X” w nawiasach kwadratowych przed tą opcją.
Jovan Ružić

Odpowiedzi:


991

makefile ma bardzo głupie relacje z tabulatorami, wszystkie akcje każdej reguły są identyfikowane przez tabulatory. I nie, 4 spacje nie tworzą tabulacji, tylko tabulacja tworzy tabulator.

do sprawdzenia używam polecenia cat -e -t -v makefile_name

Pokazuje obecność tabulatorów z ^Izakończeniami linii z $obydwoma, które są niezbędne, aby upewnić się, że zależności kończą się poprawnie, a tabulatory zaznaczają akcję reguł, dzięki czemu można je łatwo zidentyfikować w narzędziu make.

Przykład:

Kaizen ~/so_test $ cat -e -t -v  mk.t
all:ll$      ## here the $ is end of line ...                   
$
ll:ll.c   $
^Igcc  -c  -Wall -Werror -02 c.c ll.c  -o  ll  $@  $<$ 
## the ^I above means a tab was there before the action part, so this line is ok .
 $
clean :$
   \rm -fr ll$
## see here there is no ^I which means , tab is not present .... 
## in this case you need to open the file again and edit/ensure a tab 
## starts the action part

8
„cat -e -t -v nazwa_pliku_ Makefile” jest najlepszą rzeczą. Zawsze. Wciąż wpatrywałem się w ekran, widząc coś, co wyglądało jak tabulator, kompletnie brakuje mi, że to JEDNA LINIA w całym pliku, która używała spacji zamiast twardego tabulatora.
arinmorf

Dziękuję bardzo! Kompilowałem kod źródłowy dużego projektu. Wkleiłem kilka wierszy makefilez samouczka i nie zadziałało. Dopiero po usunięciu spacji i wstawieniu Tabdziałało!
rzaaeeff

Podczas kopiowania / wklejania z jednego makefile do innego za pomocą edytora vi (lub vim) pamiętaj, aby przypadkowo nie pobrać linii ~ (tylda) wskazującej koniec pliku. Prawdziwe ~ wygląda jak znacznik vi i spowoduje „*** brakujący separator. Stop.” błąd. Może się to wydawać oczywiste, ale gdy zdarzy się to przypadkowo, nie jest to oczywiste. Zobacz moje komentarze na blogu, aby uzyskać więcej informacji.
Scott

3
-vopcja catpolecenia jest tutaj zbędna, ponieważ -eśrodki -vEi -tśrodki -vT.
xxks-kkk

2
Oto znak tabulacji, jeśli ktoś użyje edytora, który zastępuje tabulatory, skopiuj i wklej tutaj:.
Ivan Borshchov

32

W VS Code po prostu kliknij „Space: 4” w prawym rogu i zmień go na tab podczas edycji pliku Makefile.


1
Tam nawet tego nie zauważyłem - dzięki za te informacje. Wcześniej korzystałem z wyrażenia regularnego find-replace, ale jest to o wiele ładniejsze.
Peanut

VS Code rozpoznał, że mój plik „common.mk”, wyodrębniony z nieprefiksowego „Makefile” był plikiem make i podświetlił go poprawnie - ale po cichu zaczął wcięcia ze spacjami zamiast tabulatorów.
Francis Norton

Dzięki za pomoc! Zdecydowanie nie zauważyłem, że w tym dolnym rogu były ustawienia kart.
se_brandon

28

Zawsze powinieneś pisać polecenie po Tabspacji, a nie spacji.

Dotyczy to gcclinii (linia 4) w twoim przypadku. Musisz wcześniej wstawić kartę gcc.

Wymienić również \rm -fr llz rm -fr ll. Wstaw tabulatory również przed tym poleceniem.


3
Aby być bardzo jasnym, musi być twardy znak TAB jako pierwszy znak w każdym logicznym wierszu przepisu. Po TAB możesz dodać dowolny biały znak.
MadScientist

czy obszar tabulacji powinien być równy 2 lub 4? w /.vimrc ustaw tabstop = 2 lub 4?
Rahul Reddy

@RahulReddy sposób, w jaki edytor wyświetla kartę, nie ma nic wspólnego z tym, czy w konfiguracji występuje znak tabulacji.
xaxxon

Świetna wskazówka, ponieważ miałem wolne miejsca z przodu. Kiedy sprawdziłem, zadziałało. Znakomity :)
indianwebdevil

9

Rozwiązaniem PyCharmbyłoby zainstalowanie Makefile supportwtyczki:

  1. Otwórz Preferences( cmd + ,)
  2. Idź do Plugins->Marketplace
  3. Wyszukaj Makefile support, zainstaluj i uruchom ponownie IDE.

To powinno rozwiązać problem i zapewnić składnię dla makefile.


Pomaga to również w GoLand
Vizjerei

Uważam IDE za prawdziwe sprawy. Edycja kart nie jest obsługiwana w pycharm. Kiedy zmieniam na ATOM, wejście TAB działa.
Moonlight Knight

6

To dość stare pytanie, ale wciąż chciałbym powiedzieć o jeszcze jednej opcji za pomocą vi/vimedytora do wizualizacji kart. Jeśli masz vi/vimzainstalowany, otwórz Makefile(np. vim Makefile) I wprowadź :set list. Spowoduje to wyświetlenie liczby zakładek wstawionych jak poniżej,

 %-linux: force$
^I@if [ "$(GCC_VERSION)" = "2.96" ] ; then \$
^I^Iecho ===== Generating build tree for legacy $@ architecture =====; \$
^I^I$(CONFIGURE) $(CWD) $@ legacy; \$
^Ielse \$
^I^Iecho ===== Generating build tree for $@ architecture =====; \$
^I^I$(CONFIGURE) $(CWD) $@; \$
^Ifi$
^Icd build-$@;make$

6

Za pomocą .editorconfigdo automatycznej naprawy zakładek:

root = true

[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 4

[Makefile]
indent_style = tab

4

Kluczowym punktem było „HARD TAB” 1. Sprawdź, czy użyłeś TAB zamiast białych znaków 2. Sprawdź .vimrc dla „set tabstop = X”


2

Jeśli ktoś z was używa produktu firmy Intellij, rozwiązaniem tego jest:

  1. Wybierz Preferencje> Edytor> Styl kodu
  2. tutaj musisz wybrać typ pliku związany z problemem. Ale najprawdopodobniej musisz wybraćOther File Types .
  3. W otwartej zakładce zaznacz pole wyboru Use tab characteri bądź ostrożny, Tab sizea Indentwartości muszą wynosić 4.


0

Wynika to z faktu, że tabulator jest zastępowany spacjami. Aby wyłączyć tę funkcję, przejdź do

gedit-> edycja-> preferencje-> edytor

i usuń czek na

zamień tabulator spacją

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.