这个Makefile有什么问题?

时间:2009-11-16 00:21:07

标签: makefile

当我在以下Makefile上运行make all时,我收到此错误:

Makefile:5:***缺少分隔符。停止。

它有什么问题,如何解决?

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

4 个答案:

答案 0 :(得分:11)

天儿真好,

您需要制表符来缩进每个目标下方的行。

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一般惯例是你应该为宏使用大括号而不是括号。使用括号是将对象替换回存档所遗留下来的遗留问题。所以上面更好地表达为:

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

答案 1 :(得分:7)

你需要像这样缩进。 (注意:他们将我的标签更改为4空格。请确保使用制表符缩进。)

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

不需要额外的空行,但缩进是。如果您想要all,还需要制定make all规则。

答案 2 :(得分:5)

通常,这种错误意味着在Makefile中缩进行时错误地使用了空格而不是标签

您的示例似乎已粘贴而没有缩进,但我无法判断您的文件是否真的如此或是否存在粘贴错误。在以下内容中:

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

$(CC)之前的空格必须是制表符,而不是空格:

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

答案 3 :(得分:2)

空白格式化可以解决这个问题。在Make whitespace中 critical 。操作必须在前面有一个制表符,才能被Make识别。 e.g。


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

请注意,\t表示< tab>。不是4个空格,不是任何空格,而是标签

同时确保依赖项之间存在空白,即如果您要说 file 依赖项,请确保上方有一个空白行。