【问题标题】:What's wrong with this Makefile?这个 Makefile 有什么问题?
【发布时间】:2009-11-16 00:21:07
【问题描述】:

当我在以下 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

【问题讨论】:

    标签: makefile


    【解决方案1】:

    生日,

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

    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

    【讨论】:

      【解决方案2】:

      你需要像这样缩进。 (注意:他们将我的制表符更改为 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
      

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

      【讨论】:

      • 应该指定动作行必须用一个前导制表符缩进,而不是一个前导空格...
      【解决方案3】:

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

      您的示例似乎是在没有缩进的情况下粘贴的,但我无法判断您的文件是否真的像那样,或者是否存在粘贴错误。如下:

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

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

      计算:y.tab.o lex.yy.o $(CC) -o 计算 y.tab.o lex.yy.o -ly -lfl |标签-->|

      【讨论】:

        【解决方案4】:

        空格格式会使回答这个问题变得困难。在 Make 中,空格是关键的。动作必须在前面有一个制表符才能被 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 个空格,不是任何空格,而是 tab

        还要确保依赖项之间有一个空行,即如果你要说 file: dependencies 然后确保上面有一个空行。

        【讨论】:

          猜你喜欢
          • 2017-08-15
          • 2012-01-30
          • 1970-01-01
          • 1970-01-01
          • 2012-05-26
          • 2021-08-20
          • 2015-09-23
          • 2021-02-27
          • 2012-03-10
          相关资源
          最近更新 更多