【问题标题】:Yacc and Lex inclusion confusionYacc 和 Lex 包含混淆
【发布时间】:2011-01-29 23:25:48
【问题描述】:

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

感谢您的帮助!

【问题讨论】:

  • 将 Lex 和 Yacc 生成的 C 代码包含到一个文件中是一种惯例 - 但只要它只在一个文件中完成就可以完成。您只在其他文件中包含标头,并且仅当它们确实需要标头中的信息时。

标签: makefile bison yacc lex flex-lexer


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2017-07-28
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多