Yacc和Lex包含混淆

use*_*756 2 yacc lex makefile bison flex-lexer

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

这就是我做的:

我有我的编译所有的常规文件Makefile文件,他们必须y.tab.c的或不lex.yy.c中连接(我应该让他们?)

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

#include "y.tab.c"
#include "lex.yy.c"
#include "y.tab.h"
Run Code Online (Sandbox Code Playgroud)

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

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

在函数yywrap': /src/parser.y:12: multiple definition ofyywrap'server.o:/src/parser.y:12:首先在这里定义utils.o:

在函数yyparse': /src/y.tab.c:1175: multiple definition ofyyparse'server.o:/src/y.tab.c:1175:首先在这里定义utils.o

我得到许多不同的错误,指的是不同的yy _***文件.我已成功编译过去多次调用yyparse,但这次似乎有所不同.这似乎非常像一个包含问题,但我不知道它是什么.我的所有头文件都有ifndef条件.

谢谢你的帮助!

dmc*_*kee 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...
Run Code Online (Sandbox Code Playgroud)

此外,您可以使用make来确保这些文件是相对于生成文件的最新文件:

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

lex.yy.c: project.lex
        $(LEX) $<
Run Code Online (Sandbox Code Playgroud)

或者根据需要使用更复杂的命令行.