Undefined Reference To yywrap

72,941

Solution 1

The scanner calls this function on end of file, so you can point it to another file and continue scanning its contents. If you don't need this, use

%option noyywrap

in the scanner specification.

Although disabling yywrap is certainly the best option, it may also be possible to link with -lfl to use the default yywrap() function in the library fl (i.e. libfl.a) provided by flex. Posix requires that library to be available with the linker flag -ll and the default OS X install only provides that name.

Solution 2

I prefer to define my own yywrap(). I'm compiling with C++, but the point should be obvious. If someone calls the compiler with multiple source files, I store them in a list or array, and then yywrap() is called at the end of each file to give you a chance to continue with a new file.

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;
}

Solution 3

flex doesn't always install with its development libraries (which is odd, as it is a development tool). Install the libraries, and life is better.

On Redhat base systems:

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

On Debian based systems

sudo apt-get install libfl-dev

Solution 4

As a note for followers, flex 2.6.3 has a bug where libfl.a "typically would" define yywrap but then doesn't in certain instances, so check if that's your version of flex, might be related to your problem:

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

Solution 5

int yywrap(){return(1);}

use this code at the end of the program..Simple

Share:
72,941
Nathan Campos
Author by

Nathan Campos

Electrical Engineer, Ham radio operator, photographer, used to be a programmer.

Updated on November 14, 2020

Comments

  • Nathan Campos
    Nathan Campos over 2 years

    I have a simple "language" that I'm using Flex(Lexical Analyzer), it's like this:

    /* 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);
    }
    

    The I run a flex count.l, all goes ok without errors or warnings, then when I try to do a cc lex.yy.c I got this errors:

    ubuntu@eeepc:~/Desktop$ cc lex.yy.c
    /tmp/ccwwkhvq.o: In function yylex': lex.yy.c:(.text+0x402): undefined reference toyywrap'
    /tmp/ccwwkhvq.o: In function input': lex.yy.c:(.text+0xe25): undefined reference toyywrap'
    collect2: ld returned 1 exit status

    What is wrong?