链接makefile中的问题

时间:2016-03-19 12:10:14

标签: makefile bison build-dependencies

我正在使用Bison和Flex编写一个编译器,直到最近才使用make all目标(我知道这不是一个好主意)。我现在正在重新构建我的目录结构并正确地重新构建makefile。目前我有:

/编译

--- / src

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

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

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

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

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

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

--- / bin

我想获得bin/c_codegen,这取决于AST,Context和bison和flex的输出(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标志,但它不起作用。完整的make文件是:

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

1 个答案:

答案 0 :(得分:0)

为有兴趣的人找到了问题:

事实证明我没有注意到,在我制作新的makefile的同时,我还在我的词法分析器中引入了使用strdup的新规则。我在linux计算机上试过这个改变。然后现在使用minGW在我自己的计算机上工作,由于已知的minGW问题导致字符串转换问题,而不是使用makefile,因此失败了。