嗨,我正在学习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编程的新手,我不知道如何解决这个问题。任何帮助将不胜感激。非常感谢提前。
要编译lex代码,首先应该在机器中安装flex。如果是这样,将有一个文件libfl.a。在我的机器上,我在'C:\ GnuWin32 \ lib'中安装了flex
gcc lex.yy.c -L“C:\ GnuWin32 \ lib”-lfl
如果您使用lex + yacc,则可以在定义yywrap函数时删除-lfl,或者更好的是,如果使用noyywrap选项:
%option noyywrap
%%
...
%%
我遇到了同样的问题,所以我在互联网上查了一下,并通过workcaptchabypass发现了一个解决方案2011年6月3日下午6:44 here
他说:
您可以添加此函数并正常编译
yywrap()
{
}
所以我在main函数之前提供了.lex文件中的代码。这样做之后,它应该按照它应该的方式:)
我在使用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中“打包”的方式中的一个错误。
对于错误:cannot find -lflx
在Makefile中更改:LEXLIB = -lfl
更改为LEXLIB =
。
否则,除非存在,否则删除-lfl
参数。
在努力解决与你相同的问题之后,我安装了flex-old:
sudo apt install flex-old