2016-03-19 9 views
-1

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 
+0

Haben Sie stdio.h in Ihren Lex-Code aufgenommen? – arved

Antwort

0

gefunden, das Problem für die Interessenten:

Es stellt sich heraus, dass ich nicht bemerkt hatte, dass bei mir gleichzeitig die neuen Make-Datei hatte ich auch neue Regeln eingeführt in meinem lexer, die strdup verwenden. Ich hatte diese Änderungen in einem Linux-Computer versucht. Dann funktionierte es jetzt in meinem eigenen Computer mit minGW, was aufgrund des bekannten Problems von minGW mit Stringkonvertierungsproblemen fehlschlug, und nicht mit dem Makefile.