生成错误:对`yyFlexLexer :: yyFlexLexer(std :: istream *,std :: ostream *)的未定义引用

时间:2018-08-31 12:44:40

标签: c++ flex-lexer

我在Windows计算机上的应用程序中使用了Flex,并且编译器为mingw32-make。我的C ++代码出现构建错误。

我已经完成Flex安装,并且已经完成PATH上的路由include和lib目录。
代码行是:

const char * filename;

std::fstream file;

file.open(filename, std::ios_base::in);

yyFlexLexer * scanner;

scanner = new yyFlexLexer(&file);

错误是:

"File.cpp:63: undefined reference to `yyFlexLexer::yyFlexLexer(std::istream*, std::ostream*)'"

请帮助我解决此问题。

谢谢!

1 个答案:

答案 0 :(得分:0)

File.cpp:63: undefined reference to `yyFlexLexer::yyFlexLexer(std::istream*, std::ostream*)

这意味着您的c ++词法分析器未定义,或使用其他名称定义。

如果不编译并链接flex文件,则无法编写以下内容:

#include <fstream>
#include <FlexLexer.h>
int main()
{
  const char * filename= "file.txt";;
  std::fstream file;
  file.open(filename, std::ios_base::in);

  // better use auto scanner = std::make_unique<yyFlexLexer>(&file)
  yyFlexLexer * scanner; 
  // leaks memory
  scanner = new yyFlexLexer(&file);
}

如果不编写flex文件,运行flex(默认情况下会生成lex.yy.cc),然后编译并链接所生成的代码,则以上内容将无法工作。您可以在Generating C++ Scanners中阅读所有内容。

如果您确实编译并链接了所生成的代码,则如果创建了命名扫描器,仍然可能会出现此错误。基本上,如果您的程序有多个扫描仪,则为不同的扫描仪赋予不同的名称是正确的解决方案。在这种情况下,您需要访问正确的名称。

所有这些都在flex手册的Generating C++ Scanners部分中。我在这里引用:

  

如果要创建多个(不同)词法分析器类,请使用   -P标志(或prefix =选项)将每个yyFlexLexer重命名为   其他xxFlexLexer。然后可以在您的计算机中包含   每个lexer类一次获取其他来源,首先将yyFlexLexer重命名为   如下:

#undef yyFlexLexer 
#define yyFlexLexer xxFlexLexer 
#include <FlexLexer.h> 

#undef yyFlexLexer   
#define yyFlexLexer zzFlexLexer   
#include <FlexLexer.h> 
  

例如,如果您为其中一个使用了`%option prefix =“ xx”'   扫描程序,而另一个则为`%option prefix =“ zz”'。

这很丑陋和棘手,但这是flex与C ++配合使用的方式。自90年代或之前开始,这已被记录为实验性文件。我认为它不会改变。