Что не так с этим Makefile?

Когда я запускаю make all в следующем 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

4 ответа

Решение

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

НТН

Вы должны сделать отступ так. (Примечание: они изменили мои вкладки в 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,

Обычно такого рода ошибки означают, что вы использовали ошибочно пробелы вместо табуляции при отступе строк в вашем 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
| Вкладка ->|

Форматирование пробелов может затруднить ответ. В 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 пробела, не пробелы, а табуляция!

Также убедитесь, что между зависимостями есть пустая строка, т. Е. Если вы собираетесь сказать " файл: зависимости", то убедитесь, что непосредственно над строкой есть пустая строка.

Другие вопросы по тегам