我在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*)'"
请帮助我解决此问题。
谢谢!
答案 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年代或之前开始,这已被记录为实验性文件。我认为它不会改变。