web-dev-qa-db-fra.com

Séparateur manquant dans le Makefile?

Le Makefile suivant ne fonctionne pas et je ne suis pas sûr de ce qui se passe.

CC = gcc
CFLAGS = -Wall -g

demo:
    ${CC} ${CFLAGS} demo.c -o demo
lib:
    ${CC} ${CFLAGS} lib.c -o lib
clean:
    rm -f lib demo

La démo a la fonction principale et lib a un ensemble de méthodes utilisées dans la démo.

J'ai ajouté le drapeau -c à lib. Cependant, lorsque je lance make, je reçois:

Makefile:5: *** missing separator.  Stop.
13
Kobi

Compte tenu de votre mise à jour avec l'erreur, vérifiez ce que vous avez sur la ligne avant ces commandes ${CC}. De nombreux programmes make nécessitent un caractère real tab avant que les commandes et les éditeurs insérant huit espaces (par exemple) ne les décomposent. C'est le plus souvent la cause des erreurs "Séparateur manquant".

Vous pouvez le voir avec la transcription suivante. Dans le fichier, il y a quatre espaces avant la $(xyzzy):

xyzzy=echo
all:
    $(xyzzy) hello

Donc, quand je le fais, j'obtiens la même erreur que vous: 

pax> make
makefile:3: *** missing separator.  Stop.

Mais, lorsque je le modifie et que je transforme ces quatre espaces en onglet, cela fonctionne correctement:

pax> make
echo hello
hello

Vous avez également un problème avec la façon dont vous essayez de combiner les fichiers source ensemble.

Sans l'indicateur -c sur gcc, il tentera de créer un exécutable distinct à partir de chaque de ces commandes, ce qui entraînera presque certainement des erreurs de l'éditeur de liens. Vous allez avoir besoin de quelque chose comme (simple):

CC = gcc
CFLAGS = -Wall -g

# Just compile/link all files in one hit.
demo: demo.c lib.c
   ${CC} ${CFLAGS} -o demo demo.c lib.c

clean:
    rm -f demo

ou (légèrement plus complexe):

CC = gcc
CFLAGS1 = -Wall -g -c
CFLAGS2 = -g

# Link the two object files together.

demo: demo.o lib.o
   ${CC} ${CFLAGS2} -o demo demo.o lib.o

# Compile each source file to an object.

demo.o: demo.c
   ${CC} ${CFLAGS1} -o demo.o demo.c

lib.o: lib.c
   ${CC} ${CFLAGS1} -o lib.o lib.c

clean:
    rm -f demo

Le problème avec la première solution est qu’il compile inutilement les deux programmes, même si un seul est obsolète. La deuxième solution est un peu plus intelligente.

36
paxdiablo

Ne manquez-vous pas un "onglet" (\t) avant ${CC} par hasard? 

Souvent, mon éditeur remplace les tabulations par des espaces et je reçois ce message.

CC = gcc
CFLAGS = -Wall -g

demo:
[TAB]${CC} ${CFLAGS} demo.c -o demo
lib:
[TAB]${CC} ${CFLAGS} lib.c -o lib
clean:
[TAB]rm -f lib demo
5
Gui13

lib doit être compilé en tant que bibliothèque, pas en tant que programme.

Essayez de le changer pour:

main:
    ${CC} ${CFLAGS} main.c lib.o -o main
lib:
    ${CC} ${CFLAGS} lib.c -c -o lib.o
1
Rusty

Même erreur. Quand j'utilise vi ici, les caractères spéciaux ne seront pas affichés.

La cause est simple: Il devrait y avoir une tabulation, pas des espaces devant $ {CC}.

0
Robina Li

Puisque main dépend de lib:

demo: lib demo.c

et

${CC} ${CFLAGS} lib.c -c -o lib.o
0
Karoly Horvath