Я пишу компилятор с помощью 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
Вы включили stdio.h в свой лексический код? – arved