Ich schreibe einen Compiler mit Bison und Flex und habe bis vor kurzem mit einem make all
Ziel gearbeitet (ich weiß es ist nicht so gut von einer Idee). Ich überarbeite jetzt meine Verzeichnisstruktur und überarbeite das Makefile ordnungsgemäß. Zur Zeit habe ich:Linking Problem in einem Makefile
/Compiler
---/src
---------- c_parser.y
---------- c_lexer.l
---------- AST.cpp
---------- AST.h
--------- - Kontext.cpp
---------- Context.h
---/bin
I erhalten bin/c_codegen
wollen, die auf AST abhängt, Kontext und die Ausgänge von Bison und Flex (c_parser.tab.c c_parser.tab.h c_lexer.yy.c
). Allerdings hängt c_lexer.yy.c auch von c_parser.tab.h
ab, das im Verzeichnis src/
erstellt wurde. Dieser Fehler der nicht angemeldeten Funktionen zu werfen (die in c_parser.tab.h deklariert sind), in der Regel:
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
Fehler:
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;
Ich glaube, das für den Header mit der Suche zu tun hat Dateien und versuchte daher mit der -I
Flagge, aber es hat nicht funktioniert. Die vollständige Make-Datei ist:
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
Haben Sie stdio.h in Ihren Lex-Code aufgenommen? – arved