2013-01-23 46 views
2

尽管“未定义的引用错误”问题已多次提出,但我无法找到解决问题的方法。即使函数存在,但未定义的引用错误

我想让flex和野牛在Qt应用程序中工作。我只在连接时遇到问题。

这些相关文件 -

1)icd.l - 莱克斯规范 - 它产生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的界面。但我得到以下的setUpBuffer(char const* text);tearDownBuffer(void* buffer);nextToken();无差错

/home/vinayak/codes/qt/dic_sim/icparser.cpp:1402:
error: undefined reference to `yyerror(char const*)'

而且类似的错误。基本上iclexer.c中的功能没有正确链接。

请告诉我如何修改此代码或如何更改Qt(Qt Creator)中的链接顺序?

+0

你编译和链接所有的二进制文件?你在C语言中使用'extern“C”'吗? –

+0

@DavidRodríguez-dribeas:所有的文件都被添加到项目中,所以我相信 - 所有的二进制文件都被编译和链接。不,我不在任何地方使用'extern“C”'。 –

回答

1

如果生成的头文件是完全一样的规定,即没有任何extern "C"那么你可能会面临的问题是,编译功能时,C编译器会产生未重整符号,但C++编译器将生成一个依赖于错位的名字。链接器将看到依赖关系和符号,但没有相同的名称将无法将它们匹配在一起。

查看用于生成代码的工具的文档,并找到如何生成C++兼容代码(通常只需要在头文件中包含额外的extern "C"代码)。

+0

谢谢!我配置了Flex来发出C++代码,它工作。输出确实包含'extern“C”' –

2

关于您的error: undefined reference to 'yyerror(char const*)',您可能需要阅读Bison文档,更具体地说,请阅读the part about 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. 

您的代码中可能缺少此定义。请注意0​​实际上是yy::parser::erroryy::解析器的默认命名空间(可以用%define namespace "foo"更改)和parser::默认情况下解析器类的名称(可以使用%define parser_class_name foo更改)。

您的其他错误似乎与Bison无关。

编辑:哦,你似乎正在生成C语法分析器,而不是C++分析器。那么,对C语言分析器来说也是一样的:yyerror is user-supplied

下面的定义足够简单的程序:

void 
yyerror (char const *s) 
{ 
    fprintf (stderr, "%s\n", s); 
} 
+0

+1谢谢,通过生成C++解析器,我解决了我的问题。 –

相关问题