我正在尝试使用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),但它仍然有同样的错误。答案 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之类的问题,因此您不必理会它。