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.
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.
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
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
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}.
Puisque main
dépend de lib
:
demo: lib demo.c
et
${CC} ${CFLAGS} lib.c -c -o lib.o