【问题标题】:Undefined reference to 'yylex()'未定义对 'yylex()' 的引用
【发布时间】:2010-12-01 14:18:32
【问题描述】:

我正在尝试使用 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),但它仍然有同样的错误。

【问题讨论】:

  • 您需要阅读您正在使用的 C/C++ 编译器的文档。 “-o”是一个产生输出文件的选项;下一个参数必须指定该文件的名称。 “-l”指定一个库;该文档将告诉您编译器将在其中查找此库的命名约定和位置。作为猜测,你还没有安装 flex 库。
  • 我遇到了同样的问题。我的程序用 gcc 编译,g++ 版本有问题。

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 你能在你的回答中总结一下解决方案吗?如果链接不再有效,这将很有帮助。
  • 我的错:'。编辑了答案。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 我已经安装好了。我尝试将其从 -lfl 更改为 C:/GnuWin32/lib/libfl.a (我正在尝试使用 Windows,因为 Linux 在我的计算机上有奇怪的问题,而且我还没有 Mac),但它仍然有同样的错误。
    猜你喜欢
    • 2011-05-14
    • 2011-09-19
    • 2011-03-27
    • 2022-01-22
    • 2016-04-04
    • 2015-11-03
    • 2011-08-11
    • 2019-07-22
    • 2015-07-20
    相关资源
    最近更新 更多