未定义的参考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版本,可能与您的问题有关: