2014-01-05 3 views
0

Я работаю с проектом с использованием flex/bison и пытаюсь скомпилировать его с помощью make. Файлы lex.yy.c, tab.c, tab.h из flex/bison генерируются правильно и помещаются в каталог obj. Однако при попытке скомпилировать файл obj/lex.yy.c есть ошибка, и он не может разрешить включение в файл в каталоге src/frontend. Любые идеи, в которых я ошибаюсь? Makefile и вывод включены ниже.Ошибка Makefile, не могу решить включить

Makefile:

VPATH = src obj src/frontend src/interpreter 
SRCS = lex.yy.c C.tab.c symbol_table.c nodes.c print_ast.c interpreter.c main.c 
OBJS := $(SRCS:%.c=obj/%.o) 
INCLUDES = -Isrc -Iobj -Isrc/frontend -Isrc/interpreter 
CPPFLAGS = -Wall 
LDFLAGS = -Wall 
CC = gcc 
LEX = flex 
YACC = bison -d -t -v 

all: bin/mycc 

bin/mycc: $(OBJS) 
    $(CC) -g $(LDFLAGS) $(INCLUDES) -o [email protected] $^ 

obj/lex.yy.c: C.flex obj/C.tab.h 
    $(LEX) -o [email protected] $< 

obj/C.tab.c: C.y 
    $(YACC) -o [email protected] $< 

obj/C.tab.h: obj/C.tab.c 
    @touch [email protected] 

obj/%.o: src/%.c 
    $(CC) -g $(CPPFLAGS) $(INCLUDES) -c $^ 

clean: 
    rm $(OBJS) obj/lex.yy.c obj/C.tab.c obj/C.tab.h 

depend: 
    $(CC) -M $(SRCS) > .deps 
    cat Makefile .deps > makefile 

Выход:

bison -d -t -v -o obj/C.tab.c src/frontend/C.y 
src/frontend/C.y: conflicts: 4 shift/reduce, 14 reduce/reduce 
src/frontend/C.y:248.11-53: warning: rule useless in parser due to conflicts: external_declaration: function_definition 
flex -o obj/lex.yy.c src/frontend/C.flex 
gcc -Wall -c -o obj/lex.yy.o obj/lex.yy.c 
src/frontend/C.flex:13:19: fatal error: token.h: No such file or directory 
#include "token.h" 
      ^
compilation terminated. 
make: *** [obj/lex.yy.o] Error 1 
+0

Как сгибать знать, где искать 'token.h'? –

ответ

1

Проблема заключается в том, что вы определяете -I флаги для компиляции в переменной $(INCLUDES), а не в обычном $(CPPFLAGS). В результате, когда правило по умолчанию для компиляции файлов C выполняется, оно не использует ни один из этих флагов -I, поэтому компилятор не может найти включенные файлы. Вы можете увидеть командную строку для вашего компилятора.

Чтобы исправить это, чтобы избавиться от INCLUDES = линии и добавить их все CPPFLAGS:

CPPFLAGS = -Wall -Isrc -Iobj -Isrc/frontend -Isrc/interpreter 
Смежные вопросы