Что не так с этим Makefile? - PullRequest
4 голосов
/ 16 ноября 2009

Когда я запускаю 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 ]

11 голосов
/ 16 ноября 2009

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

НТН

7 голосов
/ 16 ноября 2009

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

5 голосов
/ 16 ноября 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...