未定义的引用错误,即使存在函数
Undefined reference error even though the functions are present
尽管"未定义的引用错误"问题已经被问了好几次,但我找不到解决问题的方法。
我正在尝试让flex和野牛在Qt应用程序中工作。我只在链接方面遇到问题。
这些是相关文件-
1) icd.l - Lex 规范 - 它生成 iclexer.c 并包含函数的定义-
void yyerror(char const *s){...}
void* setUpBuffer(char const* text){...}
void tearDownBuffer(void* buffer){...}
int nextToken(){...}
2) iclexer.h
#ifndef ICLEXER_H
#define ICLEXER_H
extern void yyerror(char const *);
extern int yylex();
extern char* yytext;
extern void* setUpBuffer(char const* text);
extern void tearDownBuffer(void* buffer);
extern int nextToken();
#endif // ICLEXER_H
3) icparser.h
#ifndef ICPARSER_H
#define ICPARSER_H
#include "iclexer.h"
#include <string>
extern void initLexer(std::string const& t);
extern void clearLexer();
extern int yyparse();
class Parser
{
public:
Parser(std::string const& s)
{
initLexer(s);
}
void parse()
{
yyparse();
}
~Parser()
{
clearLexer();
}
};
#endif // ICPARSER_H
4) icd.y - 野牛规范 - 它生成 icparser.cpp并包含函数的定义-
void initLexer(std::string const& t);
void clearLexer();
int yylex();
在我的GUI代码中,我包含icparser.h并使用class Parser
的界面。但是我遇到以下错误-
/home/vinayak/codes/qt/dic_sim/icparser.cpp:1402:
错误:未定义对"yyerror(char consst*)"的引用
以及setUpBuffer(char const* text);
、tearDownBuffer(void* buffer);
和nextToken();
的类似错误。基本上,iclexer.c中的函数没有正确链接。
请告诉我如何修改此代码或如何在Qt(Qt Creator)中更改链接顺序?
如果生成的头文件与所述完全一致,即没有任何extern "C"
那么您可能面临的问题是 C 编译器在编译函数时会生成一个未修改的符号,但C++编译器会生成对损坏名称的依赖关系。链接器将看到依赖项和符号,但没有相同的名称,将无法将它们匹配在一起。
代码的工具的文档,并了解如何生成C++兼容的代码(通常只需要在标头中包含额外的extern "C"
代码)。
关于你的error: undefined reference to 'yyerror(char const*)'
,你可能想阅读Bison文档,更具体地说是关于yyerror的部分。上面写着:
— Method on parser: void error (const location_type& l, const std::string& m)
The definition for this member function must be supplied by the user: the parser
uses it to report a parser error occurring at l, described by m.
代码中可能缺少此定义。请注意,yyerror
实际上是yy::parser::error
的,yy::
解析器的默认命名空间(可以使用%define namespace "foo"
更改),默认情况下parser::
解析器类的名称(可以使用%define parser_class_name foo
更改)。
你的其他错误似乎与野牛无关。
编辑:哦,你似乎正在生成C解析器,而不是C++解析器。好吧,对于 C 解析器来说也是如此:yyerror 是用户提供的。
以下定义在简单程序中就足够了:
void
yyerror (char const *s)
{
fprintf (stderr, "%sn", s);
}
- C++模板来检查友元函数的存在
- C++quit()函数中可能存在作用域问题
- g++ 说函数不存在,即使包含正确的标头
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 根据某个函数是否存在启用模板
- 尝试根据类中 typedef 的存在来专门化模板函数
- 无论如何,我可以确定构造函数是否存在吗?
- 当覆盖存在时调用基本虚拟"binded to object"函数
- 扩展类中的可选 vir 函数,测试它在运行时是否存在
- C++ 中的函数 GetCursorPos() 和 SetCursorPos() 存在一些问题
- C++ 用于检查容器类中是否存在函数和隐式推导规则的概念
- 当模板重载可用时,检查是否存在函数的自定义重载
- C++'Undefined reference to'错误,尽管包含路径中的头文件中存在函数定义
- 如何使用CPPCHECK查找CPP文件中是否存在函数
- 检查 Linux 库中是否存在函数
- 检查模板类是否存在函数
- 存在函数模板时的参数转换
- 如何检查 C/C++ 中是否存在函数
- 未定义的引用错误,即使存在函数