对“yylex()”的未定义引用
我正在尝试使用 flex 和 bison 创建一种简单的脚本语言。现在,我只是想让计算器工作。
但我无法编译它。当我在 .l 和 .ypp 文件上运行此 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 $@ $<
,出现此错误:
undefined reference to `yylex()'
如果我为 all
发出命令,如下所示:
$(CPP) $^ -o $(PROGRAM) -lfl
它表示找不到 -lfl
。如果我这样做:
$(CPP) $^ -o -lfl $(PROGRAM)
它会返回到未定义的引用
错误。
抱歉我对此一无所知。
编辑:我已经安装了flex。我尝试将其从 -lfl 更改为 C:/GnuWin32/lib/libfl.a (我尝试使用 Windows,因为 Linux 在我的计算机上有奇怪的问题,而且我还没有 Mac),但它仍然有同样的错误。
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 $@ lt;
%.tab.cpp: %.ypp
$(YACC) -vd lt;
%.yy.o: %.yy.c
$(CPP) -c -o $@ lt;
%.yy.c: %.l
$(LEX) -o $@ lt;
%.o: %.cpp
$(CPP) -c -o $@ lt;
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.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
问题是您正在使用 g++(将其视为 C++)而不是 gcc 来编译ug.yy.c。这是定义 yylex 的文件,因此通过将其编译为 C++,您最终会得到 C++ yylex 函数,而其他文件正在寻找 C yylex 函数。
尝试将
extern "C" int yylex();
粘贴到 Hug.l 文件的第一部分,以便它将为 yylex 使用 C 链接而不是 C++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++基本上,执行以下任一操作:
在 Flex 文件中添加
%option noyywrap
并删除命令中的-lfl
部分即可。#define
yylex
asextern "C"
也可以工作。因为,它可以防止 C++ 与名称混淆。安装 flex-old 而不是 flex。 flex-old 默认情况下解决了像解决方案 2 一样的问题,所以你不必担心它。
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
asextern "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.
在 .l 文件中添加
%option noyywrap
并删除-lfl
选项对我有用。flex 2.6.4
野牛 3.8.2
Adding
%option noyywrap
in .l file and removing the-lfl
option works for me.flex 2.6.4
bison 3.8.2
你安装了flex库吗?如果是,请尝试类似的方法
have you installed the flex library ? if yes, try something like