未定义的参考yywrap

我有一个简单的“语言”,我正在使用Flex(词法分析器),就像这样:

/* Just like UNIX wc */ %{ int chars = 0; int words = 0; int lines = 0; %} %% [a-zA-Z]+ { words++; chars += strlen(yytext); } \n { chars++; lines++; } . { chars++; } %% int main() { yylex(); printf("%8d%8d%8d\n", lines, words, chars); } 

我运行一个flex count.l ,一切都ok没有错误或警告,然后当我尝试做一个cc lex.yy.c我得到这个错误:

ubuntu @ eeepc:〜/ Desktop $ cc lex.yy.c
/tmp/ccwwkhvq.o:在函数yylex': lex.yy.c:(.text+0x402): undefined reference to yywrap'
/tmp/ccwwkhvq.o:在函数input': lex.yy.c:(.text+0xe25): undefined reference to yywrap'
collect2:ld返回1退出状态

哪里不对?

扫描器在文件末尾调用此函数,因此您可以将其指向另一个文件并继续扫描其内容。 如果你不需要这个,使用

 %option noyywrap 

或者使用-lfl链接来使用flex提供的库fl (即libfl.a )中的默认yywrap()函数。

我更喜欢定义我自己的yywrap()。 我正在用C ++编译,但重点应该是显而易见的。 如果有人用多个源文件调用编译器,我将它们存储在一个列表或数组中,然后在每个文件的末尾调用yywrap(),以使您有机会继续使用新文件。

 int yywrap() { // open next reference or source file and start scanning if((yyin = compiler->getNextFile()) != NULL) { line = 0; // reset line counter for next source file return 0; } return 1; } 

flex并不总是随其开发库安装(这很奇怪,因为它是一个开发工具)。 安装库,生活更好:

 yum -y install flex-devel ./configure && make 

作为追随者的一个注释,flex 2.6.3有一个bug,libfl.a“通常会”定义yywrap,但是在某些情况下不会,所以检查这是否是您的flex版本,可能与您的问题有关:

https://github.com/westes/flex/issues/154

Interesting Posts