2

尽管多次询问“未定义的引用错误”问题,但我找不到解决问题的方法。

我正在尝试让 flex 和 bison 在 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 - Bison 规范 - 它生成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 const *)”的引用

setUpBuffer(char const* text);的类似错误。基本上iclexer.c中的函数没有正确链接。tearDownBuffer(void* buffer);nextToken();

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

4

2 回答 2

2

如果生成的头文件完全符合规定,即没有任何头文件,extern "C"那么您可能面临的问题是 C 编译器在编译函数时会生成一个未损坏的符号,但 C++ 编译器会生成对损坏名称的依赖项。链接器将看到依赖项和符号,但如果名称不同,则无法将它们匹配在一起。

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

于 2013-01-23T16:27:44.830 回答
2

关于您的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)。

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

编辑:哦,您似乎正在生成 C 解析器,而不是 C++ 解析器。好吧,对于 C 解析器来说也是如此:yyerror 是用户提供的

以下定义在简单程序中就足够了:

 void
 yyerror (char const *s)
 {
   fprintf (stderr, "%s\n", s);
 }
于 2013-01-24T09:30:03.260 回答