Undefined reference to 'yylex()'

25,970

Solution 1

The problem is that you're compiling hug.yy.c with g++ (treating it as C++) instead of gcc. This is the file that defines yylex, so by compiling it as C++ you end up with a C++ yylex function while the other files are looking for a C yylex function.

Try sticking extern "C" int yylex(); into the first section of your hug.l file so that it will use C linkage for yylex instead of C++

Solution 2

Basically, do either of the following:

  1. Adding %option noyywrap in the flex file and removing the -lfl part in the command would be OK.

  2. #define yylex as extern "C" works too. Since, it prevents C++ mixing up with the name.

  3. Install flex-old rather than flex. flex-old bydefault solves the problem like solution 2 so u dont have to bother about it.

Solution 3

have you installed the flex library ? if yes, try something like

$(CPP) $^ /path/of/flex/lib/libfl.a -o $(PROGRAM)
Share:
25,970

Related videos on Youtube

Micah
Author by

Micah

Updated on July 09, 2022

Comments

  • Micah
    Micah almost 2 years

    I'm trying to use flex and bison to create a simple scripting language. Right now, I'm just trying to get a calculator working.

    I can't get it to compile, though. When I run this makefile:

    OBJECTS = hug.tab.o hug.yy.o
    PROGRAM = hug.exe
    
    CPP = g++
    LEX = flex
    YACC = bison
    
    .PHONY: all clean
    
    all: $(OBJECTS)
    $(CPP) $^ -o $(PROGRAM)
    
    clean:
    $(RM) *.o *.output *.tab.* *.yy.* $(PROGRAM)
    
    %.tab.o: %.tab.cpp
    $(CPP) -c -o $@ $<
    
    %.tab.cpp: %.ypp
    $(YACC) -vd $<
    
    %.yy.o: %.yy.c
    $(CPP) -c -o $@ $<
    
    %.yy.c: %.l
    $(LEX) -o $@ $<
    
    %.o: %.cpp
    $(CPP) -c -o $@ $<
    

    on my .l and .ypp files, I get this error:

    undefined reference to `yylex()'
    

    And if I make the command for all like this:

    $(CPP) $^ -o $(PROGRAM) -lfl
    

    it says it couldn't find -lfl. And if I make it like this:

    $(CPP) $^ -o -lfl $(PROGRAM)
    

    it goes back to the undefined reference error.

    Sorry I'm kind of clueless about this.

    EDIT: I have flex installed. I tried changing it from -lfl to C:/GnuWin32/lib/libfl.a (I'm trying to use Windows because Linux has odd problems on my computers and I don't have a Mac yet), but it still has the same error.

    • kdgregory
      kdgregory over 14 years
      You need to read the documentation for the C/C++ compiler that you're using. "-o" is an option that produces an output file; the very next argument must specify the name of that file. "-l" specifies a library; the documentation will tell you the naming convention and location where the compiler will look for this library. As a guess, you haven't installed the flex library.
  • Micah
    Micah over 14 years
    I have it installed. I tried changing it from -lfl to C:/GnuWin32/lib/libfl.a (I'm trying to use Windows because Linux has odd problems on my computers and I don't have a Mac yet), but it still has the same error.
  • Lauren Rutledge
    Lauren Rutledge almost 5 years
    Can you summarize the solution in your answer? It would be helpful in case the link is no longer valid.
  • because_im_batman
    because_im_batman almost 5 years
    My bad :' . Edited the answer.