makefile: 4: *** séparateur manquant. Arrêtez


477

Voici mon makefile:

all:ll

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

clean :
  \rm -fr ll

Lorsque j'essaie de make cleanou make make, j'obtiens cette erreur:

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

Comment puis-je le réparer?


6
Vous pouvez utiliser .RECIPEPREFIX pour modifier l'utilisation des caractères. Voir: gnu.org/software/make/manual/html_node/…
— aseq

2
Comment cela n'a-t-il pas été fermé en double ??? Duplication possible de Faire une erreur: séparateur manquant
— jww

Dans le menu "Options -> Général" de mcedit, assurez-vous que les "Faux demi-onglets" n'ont pas de "X" entre crochets avant cette option.
— Jovan Ružić

Réponses:


995

makefile a une relation très stupide avec les onglets, toutes les actions de chaque règle sont identifiées par des onglets. Et non, 4 espaces ne font pas un onglet, seul un onglet fait un onglet.

pour vérifier j'utilise la commande cat -e -t -v makefile_name

Il montre que la présence d'onglets avec ^Iet de fins de ligne avec les $deux est essentielle pour garantir que les dépendances se terminent correctement et que les onglets marquent l'action pour les règles afin qu'elles soient facilement identifiables à l'utilitaire make.

Exemple:

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" est la meilleure chose. Déjà. J'ai continué à regarder l'écran, voyant ce qui ressemblait à un onglet, manquant totalement que ce soit la LIGNE UNIQUE dans le fichier entier qui utilise des espaces au lieu d'un onglet dur.
— arinmorf

Merci beaucoup! J'ai compilé le code source d'un gros projet. Collé quelques lignes dans le makefiledidacticiel, et cela n'a pas fonctionné. Seulement après avoir supprimé des espaces et mis à la Tabplace a fonctionné!
— rzaaeeff

Lorsque vous copiez / collez d'un makefile à un autre à l'aide de l'éditeur vi (ou vim), assurez-vous de ne pas saisir accidentellement la ligne ~ (tilde) indiquant la fin du fichier. Un vrai ~ ressemble à un marqueur vi et provoquera le "*** séparateur manquant. Arrêtez." Erreur. Cela peut sembler évident, mais quand cela arrive accidentellement, c'est loin d'être évident. Voir les commentaires de mon blog pour plus d'informations.
— Scott

3
-vL'option de catcommande est redondante ici parce que -emoyens -vEet -tmoyens -vT.
— xxks-kkk

2
Voici le caractère de tabulation si quelqu'un utilise un éditeur qui remplace les tabulations, copiez-collez-le à partir d'ici:.
— Ivan Borshchov

32

Sur VS Code, cliquez simplement sur "Espace: 4" dans le coin droit et changez-le en onglet lors de la modification de votre Makefile.


1
Je n'ai même pas remarqué cela là-bas - merci pour cette info. J'utilisais auparavant un regex find-replace mais c'est tellement plus agréable.
— Peanut

VS Code a reconnu que mon fichier 'common.mk', extrait d'un 'Makefile' sans suffixe était un fichier make, et l'a mis en surbrillance correctement - mais a doucement commencé à indenter avec des espaces au lieu d'onglets.
— Francis Norton

Merci pour l'aide! Je n'ai certainement pas remarqué qu'il y avait un onglet dans ce coin inférieur.
— se_brandon

28

Vous devez toujours écrire une commande après un Tabespace et non un espace blanc.

Cela s'applique à la gccligne (ligne # 4) dans votre cas. Vous devez insérer un onglet avant gcc.

Remplacez également \rm -fr llpar rm -fr ll. Insérez également des onglets avant cette commande.


3
Pour être très clair, il doit y avoir un caractère TAB dur comme premier caractère dans chaque ligne de recette logique. Après le TAB, vous pouvez ajouter tout type d'espace blanc que vous souhaitez.
— MadScientist

l'espace de tabulation doit-il être égal à 2 ou 4? dans /.vimrc set tabstop = 2 or 4?
— Rahul Reddy

@RahulReddy comment un éditeur affiche un onglet n'a rien à voir avec la présence ou non d'un caractère d'onglet dans la configuration.
— xaxxon

Très bon conseil, car j'avais des espaces à l'avant. Quand j'ai vérifié, cela a fonctionné. Superbe :)
— indianwebdevil

9

La solution PyCharmserait d'installer un Makefile supportplugin:

  1. Ouvert Preferences( cmd + ,)
  2. Allez à Plugins->Marketplace
  3. Recherchez Makefile support, installez et redémarrez l'IDE.

Cela devrait résoudre le problème et fournir une syntaxe pour un makefile.


Cela aide également dans GoLand
— Vizjerei

Je trouve les problèmes réels de l'IDE. L'édition des onglets n'est pas prise en charge dans pycharm. Lorsque je passe à ATOM, l'entrée TAB fonctionne.
— Moonlight Knight

6

C'est une assez vieille question mais je voudrais quand même dire une option de plus en utilisant l' vi/viméditeur pour visualiser les onglets. Si vous avez vi/viminstallé, ouvrez un Makefile(par exemple vim Makefile) et entrez :set list. Cela montrera le nombre d'onglets insérés comme ci-dessous,

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

Utilisation .editorconfigde la correction automatique des onglets:

root = true

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

[Makefile]
indent_style = tab

4

Le point clé était "HARD TAB" 1. Vérifiez si vous avez utilisé TAB au lieu d'espaces 2. Vérifiez votre .vimrc pour "set tabstop = X"


2

Si l'un d'entre vous utilise un produit Intellij, la solution est la suivante:

  1. Allez dans Préférences> Éditeur> Style de code
  2. ici, vous devez sélectionner le type de fichier lié à votre problème. Mais très probablement, vous devez sélectionner Other File Types.
  3. Dans l'onglet ouvert, cochez la case Use tab characteret faites attention, Tab sizeet les Indentvaleurs doivent être 4.

2

Si vous utilisez mcedit pour modifier le makefile. vous devez voir la marque suivante. entrez la description de l'image ici


0

En effet, tab est remplacé par des espaces. Pour désactiver cette fonction, accédez à

gedit-> modifier-> préférences-> éditeur

et retirer le chèque

" remplacer l'onglet par un espace "

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.