当我在以下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
Run Code Online (Sandbox Code Playgroud)
Rob*_*lls 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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
HTH
你需要像这样缩进.(注意:他们将我的标签更改为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
Run Code Online (Sandbox Code Playgroud)
额外的空白行不是必需的,但缩进是.all
如果你愿意,你还需要制定规则make all
.
通常,这种错误意味着在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-->|