使用Flex开发词法分析器遇undefined reference to 'yylex'错误求助
解决Flex C++模式下
undefined reference to 'yylex'的问题 问题根源很明确:你同时用了%option c++和extern "C" int yylex();声明,两者冲突了。Flex开启C模式后,会生成带C名字修饰的yylex函数,但extern "C"会强制编译器按C语言的符号规则查找,两边对不上,就报了链接错误。
直接按下面的步骤修复:
删掉
extern "C" int yylex();这行
把你scanner.l里%{...%}块中的这行声明彻底移除,C++模式下根本不需要这个,Flex生成的代码已经自带正确的yylex定义。调整主程序调用方式(如果有主程序的话)
Flex 2.6.4的C++模式中,yylex是yyFlexLexer类的成员函数,不是全局函数。如果你的主程序要调用词法分析,得这么写:- 主程序里包含
FlexLexer.h - 实例化
yyFlexLexer对象,调用它的yylex方法
示例主程序main.cpp:
#include "FlexLexer.h" int main() { yyFlexLexer lexer; lexer.yylex(); return 0; }- 主程序里包含
确保编译命令正确
编译时要把主程序和lex生成的文件一起编译,链接库放在后面:g++ main.cpp lex.yy.cc -lfl如果没有单独的主程序,只是测试lex代码,也可以直接编译生成的文件,但要注意C++模式下生成的代码需要依赖
yyFlexLexer类,所以上面的主程序写法是标准操作。保留
%option noyywrap
这个选项是对的,已经帮你避免了对yywrap函数的依赖,不用改。
给你一个完整的可运行示例:
修正后的scanner.l
%{ #include <iostream> // 这里已经去掉了extern "C"声明 %} %option c++ %option noyywrap %% "hello" { std::cout << "匹配到hello\n"; } [0-9]+ { std::cout << "匹配到数字: " << yytext << "\n"; } .|\n { /* 忽略其他字符 */ } %%
编译运行步骤
- 生成lex代码:
flex scanner.l - 编写上面的main.cpp
- 编译:
g++ main.cpp lex.yy.cc -lfl - 运行:
./a.out,输入内容就能看到匹配结果了
内容的提问来源于stack exchange,提问作者林子嵎
相关产品推荐
相关产品推荐

