makefile: 4: *** separador ausente. Pare


476

Este é o meu makefile:

all:ll

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

clean :
  \rm -fr ll

Quando tento make cleanou make makerecebo este erro:

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

Como posso corrigir isso?


6
Você pode usar .RECIPEPREFIX para alterar o uso de caracteres. Veja: gnu.org/software/make/manual/html_node/…
aseq

2
Como isso não foi fechado como duplicado ??? Possível duplicata do erro
jww

No mcedit, "Opções -> Geral", certifique-se de que "Meias abas falsas" não tenham "X" entre colchetes antes dessa opção.
Jovan Ružić 21/03/19

Respostas:


994

makefile tem uma relação muito estúpida com guias, todas as ações de todas as regras são identificadas por guias. E não, 4 espaços não formam uma guia, apenas uma guia cria uma guia.

para verificar eu uso o comando cat -e -t -v makefile_name

Ele mostra a presença de guias ^Ie terminações de linha com $ambas são vitais para garantir que as dependências terminem corretamente e as guias marcam a ação das regras para que sejam facilmente identificáveis ​​pelo utilitário make.

Exemplo:

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" é a melhor coisa. Sempre. Fiquei olhando fixamente para a tela, vendo o que parecia uma aba, perdendo totalmente que é a ÚNICA LINHA em todo o arquivo que utilizava espaços em vez de uma aba rígida.
Arinmorf

Muito obrigado! Eu tenho compilado o código fonte do grande projeto. Colou algumas linhas no makefiletutorial e não funcionou. Somente após excluir espaços e colocar em Tabvez disso funcionou!
precisa saber é o seguinte

Ao copiar / colar de um makefile para outro usando o editor vi (ou vim), certifique-se de não pegar acidentalmente a linha ~ (til) indicando o final do arquivo. Um verdadeiro ~ se parece com um marcador vi e causará o "*** separador ausente. Pare". erro. Isso pode parecer óbvio, mas quando acontece acidentalmente, está longe de ser evidente. Veja o meu comentário no blog para obter mais informações.
2626 Scott Scott

3
-vA opção de catcomando é redundante aqui porque -esignifica -vEe -tsignifica -vT.
Xxks-kkk

2
Aqui está o caractere de tabulação se alguém usar o editor que substitui as tabs, copie e cole a partir daqui:.
Ivan Borshchov

32

No VS Code, clique no "Espaço: 4" no canto inferior direito e mude para tab ao editar o Makefile.


1
Eu nem percebi isso lá em baixo - obrigado por essa informação. Eu estava usando um regex find-replace, mas isso é muito melhor.
Amendoim

O VS Code reconheceu que meu arquivo 'common.mk', extraído de um 'Makefile' sem sufixo, era um arquivo make e o destacou corretamente - mas silenciosamente começou a recuar com espaços em vez de guias.
Francis Norton

Obrigado pela ajuda! Definitivamente, eu não percebi que havia uma guia na parte inferior.
se_brandon

28

Você deve sempre escrever o comando após um Tabespaço em branco e não.

Isso se aplica à gcclinha (linha 4) no seu caso. Você precisa inserir a guia antes gcc.

Substitua também \rm -fr llpor rm -fr ll. Insira abas antes deste comando também.


3
Para ficar bem claro, deve haver um caractere TAB rígido como o primeiro caractere em cada linha de receita lógica. Após a guia TAB, você pode adicionar qualquer tipo de espaço em branco que desejar.
precisa saber é o seguinte

o espaço de tabulação deve ser igual a 2 ou 4? em /.vimrc set tabstop = 2 ou 4?
Rahul Reddy

@RahulReddy, como um editor exibe uma guia, não tem nada a ver com a existência ou não de um caractere de tabulação na configuração.
Xaxxon

Ótima dica, porque eu estava tendo espaços na frente. Quando chequei, funcionou. Superb :)
indianwebdevil

9

A solução PyCharmseria instalar um Makefile supportplugin:

  1. Aberto Preferences( cmd + ,)
  2. Vá para Plugins->Marketplace
  3. Procure Makefile support, instale e reinicie o IDE.

Isso deve corrigir o problema e fornecer uma sintaxe para um makefile.


Isso também ajuda na Goland
Vizjerei

Acho IDE assuntos reais. A edição de guias não é suportada no pycharm. Quando mudo para ATOM, a entrada TAB funciona.
Moonlight Knight

6

É uma pergunta bastante antiga, mas ainda assim gostaria de dizer mais uma opção usando o vi/vimeditor para visualizar as guias. Se você vi/viminstalou, abra um Makefile(por exemplo vim Makefile) e digite :set list. Isso mostrará o número de guias inseridas como abaixo,

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

Usando .editorconfigpara corrigir as guias automaticamente:

root = true

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

[Makefile]
indent_style = tab

4

O ponto principal foi "HARD TAB" 1. Verifique se você usou TAB em vez de espaço em branco 2. Verifique no .vimrc se "set tabstop = X"


2

Se algum de vocês estiver usando um produto da Intellij, a solução para isso é a seguinte:

  1. Vá para Preferências> Editor> Estilo do Código
  2. aqui você precisa selecionar o tipo de arquivo relacionado ao seu problema. Mas provavelmente você precisa selecionar Other File Types.
  3. Na guia aberta, marque a caixa de seleção Use tab charactere tenha cuidado, Tab sizee os Indentvalores devem ser 4.

2

Se você estiver usando o mcedit para edição do makefile. você tem que ver a seguinte marca. insira a descrição da imagem aqui


0

Isso ocorre porque a guia é substituída por espaços. Para desativar esse recurso, vá para

gedit-> editar-> preferências-> editor

e remova a verificação de

" substituir tabulação por espaço "

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.