当我在以下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
答案 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 :依赖项,请确保上方有一个空白行。