未定义的引用错误,即使存在函数

Undefined reference error even though the functions are present

本文关键字:存在 函数 引用 错误 未定义      更新时间:2023-10-16

尽管"未定义的引用错误"问题已经被问了好几次,但我找不到解决问题的方法。

我正在尝试让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);
 }