我想知道如何正确地编译带有调用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'中
服务器
:/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条件。

谢谢你的帮助!

最佳答案

您应该编译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) $<

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

关于makefile - Yacc和Lex包含混淆,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2486106/

10-11 18:27