2016-03-19 6 views
-1

Я пишу компилятор с помощью Bison и Flex и до недавнего времени работали с целевым объектом make all (я знаю, что это не очень хорошая идея). Теперь я переделываю структуру каталогов и правильно делаю makefile. В настоящее время у меня есть:Ссылка на проблему в make-файле

/Составитель

---/ЦСИ

---------- c_parser.y

---------- c_lexer.l

---------- AST.cpp

---------- AST.h

--------- - Context.cpp

---------- Context.h

---/бен

Я хочу получить bin/c_codegen, которая зависит от AST, контекста и выходов зубров и прогибается (c_parser.tab.c c_parser.tab.h c_lexer.yy.c). Однако c_lexer.yy.c также зависит от c_parser.tab.h, который создается в каталоге src/. Это бросает ошибки незаявленных функций (которые объявлены в c_parser.tab.h), в правиле:

bin/lex.yy.o: src/lex.yy.c src/c_parser.tab.h 
    g++ -std=c++11 -w -I ./src -c -o bin/lex.yy.o src/lex.yy.c 

Ошибка:

src/lex.yy.c: In function 'void yy_init_buffer(YY_BUFFER_STATE, FILE*)': 
src/lex.yy.c:1690:59: error: 'fileno' was not declared in this scope 
     b->yy_is_interactive = file ? (isatty(fileno(file)) > 0) : 0; 

Я считаю, что это связано с поиском заголовка файлы и поэтому попытался использовать флаг -I, но он не сработал. Полный макияж файл:

bin/c_codegen: bin/lex.yy.o bin/c_parser.tab.o bin/AST.o bin/context.o 
    g++ -std=c++11 -w -I ./src -o bin/c_codegen bin/lex.yy.o bin/c_parser.tab.o bin/AST.o bin/context.o 

bin/lex.yy.o: src/lex.yy.c src/c_parser.tab.h 
    g++ -std=c++11 -w -I ./src -c -o bin/lex.yy.o src/lex.yy.c 

bin/c_parser.tab.o: src/c_parser.tab.c src/c_parser.tab.h 
    g++ -std=c++11 -w -c -o bin/c_parser.tab.o src/c_parser.tab.c 

bin/AST.o: src/AST.cpp src/AST.h 
    g++ -std=c++11 -w -c -o bin/AST.o src/AST.cpp 

bin/context.o: src/context.cpp src/context.h 
    g++ -std=c++11 -w -c -o bin/context.o src/context.cpp 

src/c_parser.tab.c src/c_parser.tab.h: src/c_parser.y 
    win_bison -d -o src/c_parser.tab.c -v src/c_parser.y 

src/lex.yy.c: src/c_parser.tab.h 
    flex -o src/lex.yy.c src/c_lexer.l 

all: 
    flex -o src/lex.yy.c src/c_lexer.l 
    win_bison -d -o src/c_parser.tab.c -v src/c_parser.y --warnings=none 
    g++ -std=c++11 -w -o bin/c_codegen src/lex.yy.c src/c_parser.tab.c src/AST.cpp src/context.cpp 

clean: 
    rm -f src/lex.yy.c src/c_parser.tab.h src/c_parser.tab.c bin/*.o bin/c_codegen tmp_*.txt 
+0

Вы включили stdio.h в свой лексический код? – arved

ответ

0

Нашел проблему для тех, кто заинтересован:

Оказывается, что я не заметил, что в то же самое время я сделал новый Makefile я также введены новые правила в моем lexer, которые используют strdup. Я пробовал эти изменения на компьютере Linux. Затем, работая на моем собственном компьютере с minGW, он терпел неудачу из-за известной проблемы minGW с проблемами преобразования строк, а не с make-файлом.