2009-11-16 8 views
4

Lorsque je cours tout faire sur le Makefile suivant j'ai cette erreur:Quel est le problème avec ce Makefile?

Makefile: 5: *** séparateur manquant. Arrêtez.

Qu'est-ce qui ne va pas et comment le réparer?

LEX = lex 
YACC = yacc 
CC = gcc 
calcu: y.tab.o lex.yy.o 
$(CC) -o calcu y.tab.o lex.yy.o -ly -lfl 
y.tab.c y.tab.h: parser.y 
$(YACC) -d parser.y 
y.tab.o: y.tab.c parser.h 
$(CC) -c y.tab.c 
lex.yy.o: y.tab.h lex.yy.c 
$(CC) -c lex.yy.c 
lex.yy.c: calclexer.l parser.h 
$(LEX) calclexer.l 
clean: 
rm *.o 
rm *.c 
rm calcu 

Répondre

11

G'day,

Vous devez tabulations pour indenter les lignes en dessous de chaque cible.

LEX = lex 
YACC = yacc 
CC = gcc 
calcu: y.tab.o lex.yy.o 
    $(CC) -o calcu y.tab.o lex.yy.o -ly -lfl 
y.tab.c y.tab.h: parser.y 
    $(YACC) -d parser.y 
y.tab.o: y.tab.c parser.h 
    $(CC) -c y.tab.c 
lex.yy.o: y.tab.h lex.yy.c 
    $(CC) -c lex.yy.c 
lex.yy.c: calclexer.l parser.h 
    $(LEX) calclexer.l 
clean: 
    rm *.o 
    rm *.c 
    rm calcu 

BTW La convention générale est que vous devriez utiliser des accolades plutôt que des crochets pour vos macros. L'utilisation de parenthèses est une chose héritée de la substitution d'un objet à une archive. Donc, ce qui précède est mieux exprimée:

LEX = lex 
YACC = yacc 
CC = gcc 
calcu: y.tab.o lex.yy.o 
    ${CC} -o calcu y.tab.o lex.yy.o -ly -lfl 
y.tab.c y.tab.h: parser.y 
    ${YACC} -d parser.y 
y.tab.o: y.tab.c parser.h 
    ${CC} -c y.tab.c 
lex.yy.o: y.tab.h lex.yy.c 
    ${CC} -c lex.yy.c 
lex.yy.c: calclexer.l parser.h 
    ${LEX} calclexer.l 
clean: 
    rm *.o 
    rm *.c 
    rm calcu 

HTH

5

En général, ce genre de erreur signifie que vous avez utilisé à tort espaces au lieu d'un onglet lorsque les lignes dans votre indenter Makefile.

Votre exemple semble avoir été collé sans indentation, mais je ne peux pas dire si votre fichier ressemble vraiment à cela ou s'il y a eu une erreur de collage. Dans ce qui suit:

 
calcu: y.tab.o lex.yy.o 
     $(CC) -o calcu y.tab.o lex.yy.o -ly -lfl 

l'espace avant $(CC) doit être un onglet, et non des espaces:

 
calcu: y.tab.o lex.yy.o 
     $(CC) -o calcu y.tab.o lex.yy.o -ly -lfl 
|tab-->| 
2

mise en forme peut faire Whitespace répondre à cette difficile. Dans Make whitespace est critique. Les actions doivent avoir un caractère de tabulation devant être reconnu comme tel par Make. par exemple.


calcu: y.tab.o lex.yy.o 
\t$(CC) -o calcu y.tab.o lex.yy.o -ly -lfl y.tab.c y.tab.h: parser.y 

Notez que \t signifie onglet <>. Pas 4 espaces, pas d'espaces, mais tab!

assurent aussi une ligne vide entre les dépendances, à savoir si vous allez dire fichier: dépendances puis assurer d'une ligne vide juste au-dessus.

7

Vous devez en retrait, comme si. (Remarque: ils ont changé mes onglets en 4space Assurez-vous de mettre en retrait avec le caractère de tabulation..)

LEX = lex 
YACC = yacc 
CC = gcc 

calcu: y.tab.o lex.yy.o 
    $(CC) -o calcu y.tab.o lex.yy.o -ly -lfl 

y.tab.c y.tab.h: parser.y 
    $(YACC) -d parser.y 

y.tab.o: y.tab.c parser.h 
    $(CC) -c y.tab.c 

lex.yy.o: y.tab.h lex.yy.c 
    $(CC) -c lex.yy.c 

lex.yy.c: calclexer.l parser.h 
    $(LEX) calclexer.l 

clean: 
    rm *.o 
    rm *.c 
    rm calcu 

Les lignes vides supplémentaires ne sont pas nécessaires, mais la mise en retrait est. Vous devrez également définir une règle all si vous souhaitez make all.

+1

Doit spécifier que les lignes d'action doivent être indentées avec une tabulation en tête et non avec un espace de début ... – dmckee