14

我正在尝试使用 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

3 回答 3

17

问题是您使用 g++(将其视为 C++)而不是 gcc 编译 hug.yy.c。这是定义yylex.

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

于 2011-12-07T23:18:04.370 回答
5

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

  1. 添加%option noyywrapflex 文件并删除-lfl命令中的部分就可以了。

  2. #define yylex也一样extern "C"。因为,它可以防止 C++ 与名称混淆。

  3. 安装 flex-old 而不是 flex。flex-old 默认解决了像解决方案 2 这样的问题,所以你不必为此烦恼。

于 2019-07-16T16:16:14.407 回答
1

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

$(CPP) $^ /path/of/flex/lib/libfl.a -o $(PROGRAM)
于 2009-09-27T11:02:35.280 回答