2009-11-16 46 views
4

當我運行所有關於以下Makefile我得到這個錯誤:這個Makefile有什麼問題?

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 

回答

11

G'day,

您需要製表符縮進每個目標下方的行。

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 

順便說一句,一般慣例是你應該爲你的宏使用大括號而不是括號。使用括號是將對象替換回歸檔所遺留的遺留問題。

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

一般情況下,這種錯誤意味着縮進在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-->| 
2

空白格式可以回答這個困難。在使空格爲至關重要。操作必須在前面有製表符才能被Make識別。例如


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意味着<標籤>。不是4個空格,沒有任何空格,但是標籤

還要確保有依賴關係之間的空行,也就是說,如果你會說文件依賴則確保有一個空行正上方。

7

您需要縮進像這樣:因爲所以上面的更好表示。 (注:他們改變了我的標籤爲4space確保與製表符縮進。)

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 

不需要多餘的空行,但縮進的。如果您想要make all,您還需要制定all規則。

+1

應該指定動作行必須用前導製表符縮進而不是前導空格... – dmckee