Lex编译报错:函数yylex存在未定义引用,求解决方案
解决Lex & Yacc中`yylex'未定义引用的问题
看起来你在跟着经典的《Lex & Yacc》(1992版)做第3章示例时踩了链接阶段的坑,这个undefined reference to 'yylex'错误其实很常见,我来帮你一步步排查解决:
核心原因
这个错误是链接阶段的问题,意味着编译器找到了yylex的声明,但找不到它的实现代码。通常是因为编译时没把Lex生成的代码或者对应的库包含进去。
分步解决办法
1. 检查编译命令是否正确
你需要按照标准流程生成并编译代码:
- 首先用Lex处理你的
.l文件,生成包含yylex实现的代码:
这会产出lex file.llex.yy.c文件。 - 然后用Yacc处理你的
.y文件(比如file.y),记得加-d参数生成头文件y.tab.h:yacc -d file.y - 最后编译时,必须把两个生成的C文件都包含,还要链接Lex/Flex的库:
这里的gcc lex.yy.c y.tab.c -o my_program -lfl-lfl是链接Flex库(如果是传统Lex环境,可能需要换成-ll,但现在大部分环境用-lfl即可)。如果之前你只编译了y.tab.c,没加lex.yy.c或者库参数,就会触发这个错误。
2. 修正Lex代码里的笔误
我注意到你的代码里有个明显的拼写错误:
extern int yylavl;
应该是yylval而不是yylavl!而且因为你已经包含了y.tab.h,里面已经定义了YYSTYPE(也就是yylval的类型,从你用yylval.dval来看是个union),所以正确的写法应该是:
extern YYSTYPE yylval;
这个笔误虽然不是当前报错的直接原因,但后续可能会导致其他变量未定义的问题,建议先修正。
3. 确保Yacc文件里正确声明yylex
如果你的Yacc文件(.y)里没有显式声明yylex,有些版本的Yacc/Bison可能会默认假设它是外部函数,但为了保险起见,可以在Yacc代码的%{ ... %}部分加上:
extern int yylex(void);
这样编译器能明确找到yylex的声明,避免链接时的歧义。
额外提示
如果按照上面的步骤还是报错,可以检查:
- 删除之前生成的旧文件(比如
lex.yy.c、y.tab.c),重新生成一次,避免缓存的旧代码干扰。 - 确认你的系统里安装了完整的Flex和Bison(或者传统Lex/Yacc),有些精简环境可能只装了其中一个。
内容的提问来源于stack exchange,提问作者Kamal El-Saaid
相关产品推荐
相关产品推荐

