【问题标题】:Flex and Yacc - Cannot find - lfl?Flex 和 Yacc - 找不到 - lfl?
【发布时间】:2012-04-27 21:09:22
【问题描述】:

您好,我正在学习 Lex 和 yacc。我创建了以下 lex 程序。

%{
#include <stdio.h>
%}

%%
[0123456789]+           printf("NUMBER\n");
[a-zA-Z][a-zA-Z0-9]*    printf("WORD\n");
%%

我正在尝试使用以下命令运行它:

  1. lex example1.l
  2. cc lex.yy.c -o example1 -ll

也试过 cc lex.yy.c -o example1 -lfl

当我输入上面的第二个命令形式时,我得到错误:

D:\workdir\flexyacc\Test3>gcc lex.yy.c -o Test -lfl
C:\Dev-Cpp\bin\..\lib\gcc\mingw32\3.4.2\..\..\..\..\mingw32\bin\ld.exe: cannot find -lfl
collect2: ld returned 1 exit status

我尝试用谷歌搜索这个错误,但到目前为止没有运气。因为我是 Lex 编程的新手,所以我不明白如何解决这个问题。任何帮助将不胜感激。提前非常感谢。

【问题讨论】:

  • 不确定,但认为您的参数列出错误您是否尝试过:gcc lex.yy.c -lfl -o Test
  • 如果没有找到-lfl,你确定需要它吗?在没有的情况下尝试构建,看看会发生什么。如果你得到main() undefined,那么你需要自己写一个。否则,如果你得到其他未定义的东西,那么你需要找到 Flex 库。
  • 嗨,Kaz,不适合我。

标签: yacc lex


【解决方案1】:

我在使用 MinGW 将 TXR 移植到 Windows 时遇到了这个问题。

MinGW 有自己的 flex 库,但不会将其导出到环境中。

请看这里:http://lists.nongnu.org/archive/html/txr-users/2011-10/msg00001.html

解决方法是在-lfl 之前使用-L/usr/lib。但想想这个:这是一个黑客。为什么?因为路径/usr/lib/属于MinGW,编译环境的运行时。

/usr/lib 不是工具链应该为正在构建的 Windows 程序找到库的位置(它不在库搜索路径中!)

也就是说,我们在交叉编译作业中有效地窃取了构建机器的本机库。

这就像你在 Ubuntu 上交叉编译一个 Fedora 程序,并在 /usr/lib 中帮助自己编译 Ubuntu 的静态库,而这恰好在 Fedora 交叉工具链中缺失(利用架构和目标文件格式恰好相同)。

这绝对是在 MingW 中“打包”Flex 的方式中的一个错误。

【讨论】:

  • 造成这种情况的真正原因可能是 GNU Flex 不能很好地支持交叉编译。在我之前的工作中,我通过configure 脚本的常用--host/--build 选项对Flex 进行了修补以支持正确的交叉编译。我为构建机器的工具链构建了flex,但libfl.a 被正确交叉编译到目标机器(即MIPS)。如果没有这个,Flex 只会为构建机器构建两个部分,这似乎在 MinGW 中发生了:你有一个构建机器 flex 和一个构建机器 libfl.a
【解决方案2】:

我遇到了同样的问题,所以我在网上查了一下,找到了一个解决方法,方法是工作验证码绕过 2011 年 6 月 3 日下午 6:44 发布 here

他说:

你可以添加这个函数并正常编译

yywrap()
{
}

所以我在 main 函数之前提供了 .lex 文件中的代码。这样做之后,它就按照它应该的方式解决了:)

【讨论】:

  • @faye 和 @caitriiona,yywrap 应该返回一个 int 值!如果你想让它“什么都不做”,它必须返回一个真值,比如int yywrap(){ return 1;}
【解决方案3】:

要编译 lex 代码,首先你应该在你的机器上安装 flex。 如果是这样,就会有一个文件 libfl.a。在我的机器上,我在 'C:\GnuWin32\lib' 中安装了 flex

gcc lex.yy.c -L"C:\GnuWin32\lib" -lfl

【讨论】:

    【解决方案4】:

    对于错误: cannot find -lflx

    在您的 Makefile 更改中: LEXLIB = -lflLEXLIB =

    否则,请删除所有存在的 -lfl 参数。

    【讨论】:

      【解决方案5】:

      如果你使用 lex + yacc,如果你定义了 yywrap 函数,你可以删除 -lfl,或者,如果你使用 noyywrap 选项更好:

      %option noyywrap
      %%
       ...
      %%
      

      【讨论】:

        【解决方案6】:

        在尝试解决与您相同的问题后,我安装了 flex-old:

        sudo apt install flex-old

        【讨论】:

          【解决方案7】:

          尝试在 gcc 中使用 -ll 而不是 -lfl

          【讨论】:

            【解决方案8】:

            如果您使用的是 macOSX,请将 -lfl 替换为 -ll

            【讨论】:

              猜你喜欢
              • 2014-02-13
              • 1970-01-01
              • 1970-01-01
              • 2016-08-17
              • 2016-01-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多