嗨,我正在学习Lex和yacc。我创建了以下lex程序。
%{
#include <stdio.h>
%}
%%
[0123456789]+ printf("NUMBER\n");
[a-zA-Z][a-zA-Z0-9]* printf("WORD\n");
%%
我正在尝试使用以下命令运行它:
还尝试了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编程的新手,我不知道如何解决这个问题。任何帮助将不胜感激。非常感谢提前。
答案 0 :(得分:5)
要编译lex代码,首先应该在机器中安装flex。 如果是这样,将有一个文件libfl.a。在我的机器中,我在'C:\ GnuWin32 \ lib'
中安装了flexgcc lex.yy.c -L“C:\ GnuWin32 \ lib”-lfl
答案 1 :(得分:4)
如果你使用的是lex + yacc,你可以在定义yywrap函数时删除-lfl,或者更好的是,如果你使用noyywrap选项:
%option noyywrap
%%
...
%%
答案 2 :(得分:3)
我遇到了同样的问题,所以我在互联网上查了一下,并通过workcaptchabypass发现了一个解决方案2011年6月3日下午6:44 here
他说:您可以添加此功能并正常编译
yywrap()
{
}
所以我在main函数之前提供了.lex文件中的代码。在这之后,它按照它应该的方式解决:)
答案 3 :(得分:1)
使用MinGW将TXR移植到Windows时,我遇到了这个问题。
MinGW有自己的flex库,但不会将其导出到环境中。
见这里:http://lists.nongnu.org/archive/html/txr-users/2011-10/msg00001.html
解决方法是在-L/usr/lib
之前使用-lfl
。但想想这个:它是一个黑客。为什么?因为路径/usr/lib/
属于MinGW,编译环境是运行时。
/usr/lib
不是工具链应该为正在构建的Windows程序找到libs的地方(这不是在库搜索路径中!)
也就是说,我们在交叉编译工作中有效地窃取了构建机器的本机库。
这就像你在Ubuntu上交叉编译一个Fedora程序,并帮助自己在Fedora交叉工具链中碰巧缺少/usr/lib
中的Ubuntu静态库(利用这个事实)架构和目标文件格式恰好相同)。
这绝对是Flex在MingW中“打包”的方式中的一个错误。
答案 4 :(得分:1)
如果您使用的是 macOSX,请将 -lfl
替换为 -ll
答案 5 :(得分:0)
错误:
cannot find -lflx
在Makefile中更改:
LEXLIB = -lfl
至LEXLIB =
。
否则在任何地方删除-lfl
参数。
答案 6 :(得分:0)
在尝试解决与您相同的问题之后,我安装了flex-old:
npm install
答案 7 :(得分:0)
尝试在gcc中使用 -ll 代替 -lfl