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.y
的 requires
部分中,它们的内容最终出现在 lex.yy.c
和 step3.tab.c
中,因此所有内容都定义了两次。
相反,您应该包含头文件,而不是 C 文件,然后编译 link ast.c
和 symbtable.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
成功了!
由于我的代码有点太长,我认为如果有人愿意帮助我并需要代码,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.y
的 requires
部分中,它们的内容最终出现在 lex.yy.c
和 step3.tab.c
中,因此所有内容都定义了两次。
相反,您应该包含头文件,而不是 C 文件,然后编译 link ast.c
和 symbtable.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
成功了!