Что не так с этим 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
означает
Также убедитесь, что между зависимостями есть пустая строка, т. Е. Если вы собираетесь сказать " файл: зависимости", то убедитесь, что непосредственно над строкой есть пустая строка.