2010-03-21 101 views
2

我想知道如何正確編譯一個帶有調用yyparse的Makefile的程序?Yacc和Lex包含混淆

這是我做的:

我有我的編譯所有的常規文件Makefile文件,他們有沒有連接y.tab.c的或lex.yy.c中(我應該讓他們?)

我這樣做對我的代碼頂部:

#include "y.tab.c" 
#include "lex.yy.c" 
#include "y.tab.h" 

這是當我試圖讓該程序會發生什麼:

當我只需鍵入「製造」,它給了我很多的警告。一些例子如下所示。

在功能yywrap': /src/parser.y:12: multiple definition of yywrap ' server.o :/src/parser.y:12:第一這裏定義 utils.o:

在功能yyparse': /src/y.tab.c:1175: multiple definition of yyparse' server.o:/ SRC/Y .tab.c:1175:首先在這裏定義 utils.o

我得到許多不同的錯誤指向不同的yy _ ***文件。我已經成功地編譯了過去對yyparse的多個調用,但這次似乎有所不同。這似乎很像一個包含問題的地方,但我不知道它是什麼。我所有的頭文件也都有ifndef條件。

感謝您的幫助!

+0

將Lex和Yacc生成的C代碼包含到單個文件中是常規操作 - 但只要在一個文件中完成,就可以完成。您只在其他文件中包含標題,並且僅在它們確實需要標題中的信息時才使用。 –

回答

6

你應該是編譯y.tab.clex.yy.c,不包括他們。只需將頭文件(.h)包含在需要它們的源文件中。

然後你鏈接生成的可執行文件生成的目標文件。

project: project.o t.tab.o lex.yy.o foo.o bar.o 

y.tab.o: t.tab.c y.tab.h 

lex.yy.o: lex.yy.c 

# Assuming that you have correct pattern rules setup 
# or that the implicit rules will do... 

而且,你可以用make,以確保這些文件都是最新的相對存在中生成文件:

y.tab.c y.tab.h: project.yacc 
     $(YACC) $< 

lex.yy.c: project.lex 
     $(LEX) $< 

或更復雜的命令行根據需要。