makefile: 4: *** mancante separatore. Fermare


476

Questo è il mio makefile:

all:ll

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

clean :
  \rm -fr ll

Quando cerco di make cleano make make, ottengo questo errore:

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

Come posso ripararlo?


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

2
In che modo questo non è stato chiuso come duplicato ??? Possibile duplicato di Errore: separatore mancante
jww

Nel mcedit "Opzioni -> Generale" assicurati che "Mezze schede finte" non abbiano "X" tra parentesi quadre prima di quell'opzione.
Jovan Ružić,

Risposte:


994

makefile ha una relazione molto stupida con le schede, tutte le azioni di ogni regola sono identificate dalle schede. E no, 4 spazi non formano una scheda, solo una scheda crea una scheda.

per controllare utilizzo il comando cat -e -t -v makefile_name

Mostra la presenza di schede con ^Ie le terminazioni di riga con $entrambe sono fondamentali per garantire che le dipendenze finiscano correttamente e le schede contrassegnano l'azione per le regole in modo che siano facilmente identificabili per l'utilità di creazione.

Esempio:

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 makefile_name" è la cosa migliore. Mai. Continuavo a fissare lo schermo, vedendo quella che sembrava una scheda, mi mancava del tutto che fosse la LINEA UNICA nell'intero file che utilizzava spazi anziché una scheda fissa.
Arinmorf,

Grazie mille! Ho compilato il codice sorgente di un grande progetto. Ho incollato alcune righe nel makefiletutorial e non ha funzionato. Solo dopo aver eliminato gli spazi e messo Tabinvece ha funzionato!
Rzaaeeff,

Quando si copia / incolla da un makefile a un altro usando l'editor vi (o vim), assicurarsi di non prendere accidentalmente la linea ~ (tilde) che indica la fine del file. Un vero ~ sembra un marcatore vi e causerà il "*** separatore mancante. Stop." errore. Questo può sembrare ovvio, ma quando accade per caso è tutt'altro che evidente. Vedi il commento sul mio blog per ulteriori informazioni.
Scott,

3
-vl'opzione per il catcomando qui è ridondante perché -esignifica -vEe -tsignifica -vT.
xxks-kkk,

2
Ecco il carattere di tabulazione se qualcuno usa l'editor che sostituisce le schede, copialo da qui:.
Ivan Borshchov,

32

Su VS Code, fai clic su "Spazio: 4" nell'angolo in basso e modificalo in scheda quando modifichi il tuo Makefile.


1
Non l'ho nemmeno notato laggiù - grazie per quelle informazioni. In precedenza utilizzavo un regex find-repl ma questo è molto più bello.
Peanut,

VS Code ha riconosciuto che il mio file 'common.mk', estratto da un 'Makefile' senza suffisso era un file make, e lo ha evidenziato correttamente, ma ha iniziato tranquillamente a rientrare con spazi anziché tabulazioni.
Francis Norton,

Grazie per l'aiuto! Sicuramente non ho notato che c'erano le impostazioni delle schede in quell'angolo in basso.
se_brandon,

28

Dovresti sempre scrivere il comando dopo uno Tabe non uno spazio bianco.

Questo vale per la gcclinea (linea # 4) nel tuo caso. È necessario inserire la scheda prima gcc.

Sostituisci anche \rm -fr llcon rm -fr ll. Inserisci anche le schede prima di questo comando.


3
Per essere molto chiari, ci deve essere un carattere TAB rigido come primo carattere in ogni riga della ricetta logica. Dopo la SCHEDA, puoi aggiungere qualsiasi tipo di spazio bianco desideri.
MadScientist,

il tabspace dovrebbe essere uguale a 2 o 4? in /.vimrc set tabstop = 2 o 4?
Rahul Reddy,

@RahulReddy il modo in cui un editor visualizza una scheda non ha nulla a che fare con la presenza o meno di un carattere di tabulazione nella configurazione.
xaxxon,

Ottimo consiglio, perché avevo degli spazi nella parte anteriore. Quando ho controllato ha funzionato. Superbo :)
indianwebdevil

9

La soluzione per PyCharmsarebbe installare un Makefile supportplugin:

  1. Open Preferences( cmd + ,)
  2. Vai a Plugins->Marketplace
  3. Cerca Makefile support, installa e riavvia l'IDE.

Ciò dovrebbe risolvere il problema e fornire una sintassi per un makefile.


Questo aiuta anche in GoLand
Vizjerei il

Trovo che IDE sia davvero importante. L'edizione per schede non è supportata in pycharm. Quando cambio ad ATOM, l'ingresso TAB funziona.
Moonlight Knight,

6

È una domanda piuttosto vecchia, ma vorrei ancora parlare di un'altra opzione che utilizza l' vi/vimeditor per visualizzare le schede. Se è stato vi/viminstallato, aprire un Makefile(ad es. vim Makefile) E accedere :set list. Questo mostrerà il numero di schede inserite come di seguito,

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

Utilizzo .editorconfigper correggere automaticamente le schede:

root = true

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

[Makefile]
indent_style = tab

4

Il punto chiave era "HARD TAB" 1. Controlla se hai usato TAB invece di spazi bianchi 2. Controlla il tuo .vimrc per "set tabstop = X"


2

Se qualcuno di voi utilizza un prodotto di Intellij, la soluzione è la seguente:

  1. Vai a Preferenze> Editor> Stile codice
  2. qui devi selezionare il tipo di file relativo al tuo problema. Ma molto probabilmente devi selezionare Other File Types.
  3. Nella scheda aperta selezionare la casella di controllo Use tab charactere fare attenzione, Tab sizee i Indentvalori devono essere 4.

2

Se stai usando mcedit per la modifica del makefile. devi vedere il seguente segno. inserisci qui la descrizione dell'immagine


0

Questo perché la scheda è sostituita da spazi. Per disabilitare questa funzione vai a

gedit-> Modifica-> Preferenze> Editor

e rimuovere il controllo per

" sostituisci scheda con spazio "

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.