Collectives™ on Stack Overflow
Find centralized, trusted content and collaborate around the technologies you use most.
Learn more about Collectives
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
Learn more about Teams
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.
–
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++
Basically, do either of the following:
Adding %option noyywrap
in the flex file and removing the -lfl
part in the command would be OK.
#define
yylex
as extern "C"
works too. Since, it prevents C++ mixing up with the name.
Install flex-old rather than flex. flex-old bydefault solves the problem like solution 2 so u dont have to bother about it.
–
–
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.