Yacc和Lex包含混淆

时间:2010-03-21 05:52:39

标签: makefile bison yacc lex flex-lexer

我想知道如何使用调用yyparse的Makefile正确编译程序?

这就是我的所作所为:

我有一个编译所有常规文件的Makefile,它们与y.tab.c或lex.yy.c没有任何关系(我应该拥有它们吗?)

我在我的代码之上执行此操作:

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

当我尝试制作程序时会发生这种情况:

当我输入“make”时,它会给我很多警告。一些例子如下所示。

在函数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条件。

感谢您的帮助!

1 个答案:

答案 0 :(得分: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) $<
根据需要

或更复杂的命令行。