对'yylex()'的未定义引用

时间:2009-09-26 01:02:57

标签: g++ bison lex undefined-reference flex-lexer

我正在尝试使用flex和bison来创建一个简单的脚本语言。现在,我只是想让计算器正常工作。

但是,我无法让它编译。当我运行这个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 $@ $<

在我的.l和.ypp文件上,我收到此错误:

undefined reference to `yylex()'

如果我像all这样命令:

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

它说无法找到-lfl。如果我这样做:

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

它会回到undefined reference错误。

对不起,我对此毫无头绪。

编辑:我已经安装了flex。我尝试将它从-lfl更改为C:/GnuWin32/lib/libfl.a(我正在尝试使用Windows,因为Linux在我的计算机上有奇怪的问题而我还没有Mac),但它仍然有同样的错误。

4 个答案:

答案 0 :(得分:14)

问题是你用g ++编译hug.yy.c(将其视为C ++)而不是gcc。这是定义yylex的文件,因此通过将其编译为C ++,您最终会得到一个C ++ yylex函数,而其他文件正在寻找一个C yylex函数。

尝试将extern "C" int yylex();粘贴到hug.l文件的第一部分,以便它将为yylex而不是C ++使用C链接

答案 1 :(得分:1)

你安装了flex库吗?如果是,请尝试类似

的内容
$(CPP) $^ /path/of/flex/lib/libfl.a -o $(PROGRAM)

答案 2 :(得分:0)

我附上了我的文件。

main ()
{
    return (yylex())

 }

现在它给了我一个分段错误,但我可以把它链接起来。

答案 3 :(得分:-1)

此链接中提到了一个非常简洁和最新的解决方案: https://lagunita.stanford.edu/courses/course-v1:Medicine+IPE21CC+ongoing/wiki/Engineering.Compilers.Fall2014/troubleshoot-liblibflso-undefined-reference-yylex/

基本上,请执行以下任一操作:

1。在flex文件中添加%option noyywrap并在命令中删除-lfl部分就可以了。

2.#define yylex作为extern“ C”也起作用。因为这样可以防止C ++与名称混淆。

3。安装flex-old而不是flex。 flex-old bydefault默认解决了解决方案2之类的问题,因此您不必理会它。