Flex/Bison:'said function'的多重定义

Flex/Bison: Multiple definition of 'said function'

由于我的代码有点太长,我认为如果有人愿意帮助我并需要代码,post a github link 会更容易:https://github.com/Pigums/Cminus-Compiler

在 cygwin 中,我 运行 这些命令:

bison -d step3.y
flex step3.fl
gcc step3.tab.c lex.yy.c -lfl -o step3

然后弹出如下错误:

/tmp/ccdKHQL3.o:step3.tab.c:(.text+0x0): multiple definition of `CreateTemp'
/tmp/ccfXBuoP.o:lex.yy.c:(.text+0x0): first defined here
/tmp/ccdKHQL3.o:step3.tab.c:(.text+0x4a): multiple definition of `Insert'
/tmp/ccfXBuoP.o:lex.yy.c:(.text+0x4a): first defined here
/tmp/ccdKHQL3.o:step3.tab.c:(.text+0x140): multiple definition of `PrintSym'
/tmp/ccfXBuoP.o:lex.yy.c:(.text+0x140): first defined here
/tmp/ccdKHQL3.o:step3.tab.c:(.text+0x19f): multiple definition of `Display'
/tmp/ccfXBuoP.o:lex.yy.c:(.text+0x19f): first defined here
/tmp/ccdKHQL3.o:step3.tab.c:(.text+0x1e6): multiple definition of `Search'
/tmp/ccfXBuoP.o:lex.yy.c:(.text+0x1e6): first defined here
/tmp/ccdKHQL3.o:step3.tab.c:(.text+0x266): multiple definition of `Delete'
/tmp/ccfXBuoP.o:lex.yy.c:(.text+0x266): first defined here
/tmp/ccdKHQL3.o:step3.tab.c:(.text+0x2fd): multiple definition of `ASTCreateNode'
/tmp/ccfXBuoP.o:lex.yy.c:(.text+0x2fd): first defined here
/tmp/ccdKHQL3.o:step3.tab.c:(.text+0x3c0): multiple definition of `ASTattachleft'
/tmp/ccfXBuoP.o:lex.yy.c:(.text+0x3c0): first defined here
/tmp/ccdKHQL3.o:step3.tab.c:(.text+0x3f6): multiple definition of `PT'
/tmp/ccfXBuoP.o:lex.yy.c:(.text+0x3f6): first defined here
/tmp/ccdKHQL3.o:step3.tab.c:(.text+0x427): multiple definition of `ASTprint'
/tmp/ccfXBuoP.o:lex.yy.c:(.text+0x427): first defined here
/tmp/ccdKHQL3.o:step3.tab.c:(.text+0xa83): multiple definition of `compareFormals'
/tmp/ccfXBuoP.o:lex.yy.c:(.text+0xa83): first defined here
/tmp/ccdKHQL3.o:step3.tab.c:(.bss+0x0): multiple definition of `mem'
/tmp/ccfXBuoP.o:lex.yy.c:(.bss+0x14): first defined here
collect2: error: ld returned 1 exit status

不确定我做错了什么,尝试查找错误,但我认为我得到的答案不是我要找的答案。这里有什么问题?

#include "symtable.c"
#include "ast.c"

这就是你的问题所在。通过将这两个 C 文件包含在 step3.yrequires 部分中,它们的内容最终出现在 lex.yy.cstep3.tab.c 中,因此所有内容都定义了两次。

相反,您应该包含头文件,而不是 C 文件,然后编译 link ast.csymbtable.c 通过将它们传递给 gcc:

gcc step3.tab.c lex.yy.c ast.c symtable.c -o step3

(你也可以用Makefile分别编译每个文件,然后link一起编译,这样你只需要重新编译发生变化的文件,但那是完全不同的事情)

请注意,这并非特定于 flex 或 bison。你永远不应该 #include C 文件,除非你确切地知道这意味着什么并且你有一个很好的理由。

这可能会迟到,但我必须把它留在这里。 即使我使用了正确的包含语句,我也有相同的 'Multiple definition of a function issue'。 我不太清楚为什么会发生这种情况,但结果是我的头文件中只出现了全局函数(不在任何 class 内)的多重定义错误。我有一堆实用方法,作为 class.

的成员函数意义不大

所以我得到了这些函数的 'Multiple Definitions' 错误:

所以我的解决方案是:

基本上用 class 包裹起来解决了问题,现在工作正常。

两种解决方案我都试过了。他们工作得很好。但是我在使用 class 的其他头文件中仍然有更多 'Multiple Definition' 错误。这些文件在 class 内有 方法声明 但在 class 外有 方法定义 使用 范围解析(::) .

所以我尝试了这个

remove all the method declarations and write all the method definitions inside the class

成功了!