皮皮网

【求生之路源码在哪】【绿豆app源码】【动态溯源码】liunxflex源码编译错误

2024-12-27 14:11:29 来源:小矮人源码

1.linux系统维护常见错误记录
2.CS143:编译原理|PA2:正则表达式和词法分析
3.linux-2.4 如何安装 tcpdump
4.linux内核编译出错解决办法
5.编译原理试题·

liunxflex源码编译错误

linux系统维护常见错误记录

       一:卸载的源译错时候出现的错误:

       umount /dev/nb1

       device is busy

       解决:找到是什么进程使得他busy,用 lsof /dev/nb1 . kill掉那个进程,码编然后重新umount即可。

       二:GD2编译的源译错时候出现的错误:

       The usual way to define `LIBTOOL’ is to add `AC_PROG_LIBTOOL’

       Libtool library used but `LIBTOOL’ is undefined

       [Makefile.in] Error 1

       解决:缺少编译安装的软件包。如:yum install automake,码编libjpeg-devel,libpng-devel,freetype-devel,libtiff-devel,autoconf,gettext-devel,libtool

       三:安装 snmp的时候出现的错误:

       1/bin/sed: can’t read /usr/lib/libbeecrypt.la: No such file or directory

       libtool: link: `/usr/lib/libbeecrypt.la’ is not a valid libtool archive

       make[1]: *** [libnetsnmpmibs.la] Error 1

       解决:以为缺少libbeecrypt.la ,libbeecrypt.so等共享库,源译错如:yum install libbeecrypt.la

       2/usr/bin/ld: cannot find -lelf

       解决:ln -s /usr/lib/libelf.so.1 /usr/lib/libelf.so

       3/usr/bin/ld:can’t not find -lselinux

       解决:缺少libselinux 和 libselinux-devel包,码编求生之路源码在哪如:yum install libselinux

       四:Rsync同步常见问题:

       错误一:

       @ERROR: auth failed on module xxxxx

       rsync: connection unexpectedly closed ( bytes read so far)

       rsync error: error in rsync protocol data stream (code ) at io.c()

       解决:这是源译错因为密码设置错了,无法登入成功,码编检查一下rsync.pwd,源译错看客服是码编否匹配。还有服务器端没启动rsync 服务也会出现这种情况。源译错

       错误二:

       password file must not be other-accessible

       continuing without password file

       Password:

       解决:这是码编因为rsyncd.pwd rsyncd.sec的权限不对,应该设置为。源译错如:chmod rsyncd.pwd

       错误三:

       @ERROR: chroot failed

       rsync: connection unexpectedly closed ( bytes read so far)

       rsync error: error in rsync protocol data stream (code ) at io.c()

       解决:这是码编因为你在 rsync.conf 中设置的 path 路径不存在,要新建目录才能开启同步。源译错

       错误四:

       rsync: failed to connect to ...2: No route to host ()

       rsync error: error in socket IO (code ) at clientserver.c() [receiver=2.6.9]

       解决:对方没开机、防火墙阻挡、通过的网络上有防火墙阻挡,都有可能。关闭防火墙,其实就是把tcp udp 的端口打开。

       五:软件安装的时候常出现的问题:

       configure: error: …No recognized SSL/TLS toolkit detected

       # yum -y install openssl-devel

       configure: error: no acceptable cc found in $PATH

       yum -y install gcc-c++

       configure: error: cannot find output from lex; giving up flex is not installed, install flex.

       yum -y install flex

       configure: error: xml2-config not found. Please check your libxml2 installation.

       yum -y install libxml2-devel

       configure: error: Cannot find OpenSSL’s

       yum -y install openssl-devel

       configure: error: Please reinstall the BZip2 distribution

       yum -y install bzip2-devel

       configure: error: Please reinstall the libcurl distribution - easy.h should be in /include/curl/

       yum -y install curl-devel

       configure: error: libjpeg.(a|so) not found.

       yum -y install libjpeg-devel

       configure: error: libpng.(a|so) not found.

       yum -y install libpng-devel

       configure: error: freetype2 not found!

       yum -y install freetype-devel

       configure: error: Unable to locate gmp.h

       yum -y install gmp-devel

       configure: error: Cannot find pspell

       yum -y install aspell-devel

       libtool: link: cannot find the library `/usr/lib/libbeecrypt.la’ (librpmio.la: /usr/lib/libbeecrypt.la)

       解决:缺少beecrypt包,如:

       pare.py`,通过`make dotest`和`lexer test.cl`指令,对比你的绿豆app源码lexer输出与标准输出,不断调整和优化你的`.flex`文件,直到两者完全匹配。

       在flex的`.flex`文件中,关键部分在于rules区域,这里定义了正则表达式和处理代码的映射。例如,使用正则表达式".*"匹配任意字符序列。Definitions区域包含了预定义的C代码和flex的定义,记得保持C代码的缩进一致性。在rules中,记得正则表达式单独一行,与后续代码保持适当间距。对于处理函数,根据是否返回值,C代码会有不同的编写方式,注释也需要对齐,灵活代码的调用会显示匹配信息。

       词法分析器要处理的关键字、整数、字符串、注释、符号和特殊字符,都有一套严谨的规则。例如,动态溯源码关键字的处理简单,但要确保它们与cool-parse.h中的定义一致。字符串字面量的解析则涉及状态机和转义字符,确保处理完整性和正确性。

       最后,通过构建`test.cl`并执行`make dotest`和`lexer test.cl`,持续测试并优化你的lexer。GitHub仓库会随你的学习进度更新测试用例和代码。记住,词法分析的难点在于覆盖所有可能的情况,每个细节都需要精心雕琢。现在,就让我们一起沉浸在编译原理的海洋中,感受词法分析的魔力吧!

linux-2.4 如何安装 tcpdump

       å®‰è£…过程参照以下步骤:

       1、打开网址:www.tcpdump.org/ 下载 libpcap-1.0.0.tar.gz (.0KB) 软件包,通过命令 tar zxvf libpcap-1.0.0.tar.gz 解压文件,并将其放入自定义的安装目录。

       2、打开网址:flex.sourceforge.net/ 下载 flex-2.5..tar.gz (1.MB) 软件包,通过 tar zxvf flex-2.5..tar.gz 解压文件,并将其放入上述自定义的安装目录中。

       ã€€ 注:如果没有编译安装此文件,在编译安装libpcap时,就会出现 “configure: error: Your operating system's lex is insufficient to compile libpcap.”的错误提示。

       3、打开网址:ftp.gnu.org/gnu/bison/ 下载 bison-2.4.1.tar.gz (1.9MB) 软件包,通过 tar zxvf bison-2.4.1.tar.gz 解压文件,并将其放入上述自定义的安装目录中。

       ã€€ 注:如果没有编译安装此文件,在编译安装libpcap时,就会出现 "configure: WARNING: don't have both flex and bison; reverting to lex/yacc checking for capable lex... insufficient" 的错误提示。

       4、打开网址:ftp.gnu.org/gnu/m4/ 下载 m4-1.4..tar.gz (1.2MB)软件包,通过 tar zxvf m4-1.4..tar.gz 解压文件,并将其放入上述自定义的安装目录中。

       ã€€ 注:如果没有编译安装此文件,在编译安装bison-2.4.1时,就会出现 “configure: error: GNU M4 1.4 is required”的错误提示。

       5、而后依次进入目录m4-1.4.,bison-2.4.1,flex-2.5.,libpcap-1.0.0 并执行以下命令:

       ã€€ã€€(sudo) ./configure

       ã€€ã€€(sudo) make

       ã€€ã€€(sudo) make install

linux内核编译出错解决办法

       遇到Linux内核编译中出现menuconfig没有配置界面出来的错误,通常是因为缺少必要的库文件导致无法加载curses功能。为解决此问题,首先需要确保系统已安装了curses库。通过运行以下命令进行安装:

       sudo apt-get install libncurses5-dev

       完成安装后,尝试再次执行make menuconfig命令,内核配置界面应能正常显示。

       若在编译Linux内核时遇到yylloc错误,这通常与编译器或相关工具链的版本不兼容有关。yylloc错误多见于使用flex和bison进行解析的源码开发原理项目。为解决此问题,可采取以下步骤:

       1. 确保flex和bison的版本与内核编译所需版本匹配。可通过运行以下命令检查flex和bison的版本:

       flex --version

       bison --version

       2. 若版本不匹配,考虑更新或回滚至兼容版本。可以通过apt或包管理器实现版本更新或回滚。

       3. 在编译内核前,先确保系统环境变量PATH包含flex和bison的安装路径,以确保编译器能找到所需的工具。

       4. 使用正确的编译选项和参数进行内核编译,确保所有依赖项都已正确配置。

       通过上述步骤,应能有效解决Linux内核编译过程中遇到的menuconfig配置界面缺失和yylloc错误问题,确保编译过程顺利进行。

编译原理试题·

       Lex和Yacc应用方法(一).初识Lex

       草木瓜

       Lex(Lexical Analyzar 词法分析生成器),Yacc(Yet Another Compiler Compiler

       编译器代码生成器)是Unix下十分重要的词法分析,语法分析的工具。经常用于语言分

       析,公式编译等广泛领域。遗憾的是网上中文资料介绍不是过于简单,就是跳跃太大,

       入门参考意义并不大。本文通过循序渐进的例子,从0开始了解掌握Lex和Yacc的用法。

       一.Lex(Lexical Analyzar) 初步示例

       先看简单的原神 源码例子(注:本文所有实例皆在RetHat Linux下完成):

       一个简单的Lex文件 exfirst.l 内容:

       %{

       #include "stdio.h"

       %}

       %%

       [\n] ;

       [0-9]+ printf("Int : %s\n",yytext);

       [0-9]*\.[0-9]+ printf("Float : %s\n",yytext);

       [a-zA-Z][a-zA-Z0-9]* printf("Var : %s\n",yytext);

       [\+\-\*\/\%] printf("Op : %s\n",yytext);

       . printf("Unknown : %c\n",yytext[0]);

       %%

       在命令行下执行命令flex解析,会自动生成lex.yy.c文件:

       [root@localhost liweitest]flex exfirst.l

       进行编译生成parser可执行程序:

       [root@localhost liweitest]cc -o parser lex.yy.c -ll

       [注意:如果不加-ll链结选项,cc编译时会出现以下错误,后面会进一步说明。]

       /usr/lib/gcc-lib/i-redhat-linux/3.2.2/../../../crt1.o(.text+0x): In function `_start':

       ../sysdeps/i/elf/start.S:: undefined reference to `main'

       /tmp/cciACkbX.o(.text+0xb): In function `yylex':

       : undefined reference to `yywrap'

       /tmp/cciACkbX.o(.text+0xabd): In function `input':

       : undefined reference to `yywrap'

       collect2: ld returned 1 exit status

       创建待解析的文件 file.txt:

       title

       i=1+3.9;

       a3=/6

       bcd=4%9-

       通过已生成的可执行程序,进行文件解析。

       [root@localhost liweitest]# ./parser < file.txt

       Var : title

       Var : i

       Unknown : =

       Int : 1

       Op : +

       Float : 3.9

       Unknown : ;

       Var : a3

       Unknown : =

       Int :

       Op : /

       Int : 6

       Var : bcd

       Unknown : =

       Int : 4

       Op : %

       Int : 9

       Op : -

       Int :

       到此Lex用法会有个直观的了解:

       1.定义Lex描述文件

       2.通过lex,flex工具解析成lex.yy.c文件

       3.使用cc编译lex.yy.c生成可执行程序

       再来看一个比较完整的Lex描述文件 exsec.l :

       %{

       #include "stdio.h"

       int linenum;

       %}

       %%

       title showtitle();

       [\n] linenum++;

       [0-9]+ printf("Int : %s\n",yytext);

       [0-9]*\.[0-9]+ printf("Float : %s\n",yytext);

       [a-zA-Z][a-zA-Z0-9]* printf("Var : %s\n",yytext);

       [\+\-\*\/\%] printf("Op : %s\n",yytext);

       . printf("Unknown : %c\n",yytext[0]);

       %%

       showtitle()

       {

       printf("----- Lex Example -----\n");

       }

       int main()

       {

       linenum=0;

       yylex(); /* 进行分析 */

       printf("\nLine Count: %d\n",linenum);

       return 0;

       }

       int yywrap()

       {

       return 1;

       }

       进行解析编译:

       [root@localhost liweitest]flex exsec.l

       [root@localhost liweitest]cc -o parser lex.yy.c

       [root@localhost liweitest]./parser < file.txt

       ----- Lex Example -----

       Var : i

       Unknown : =

       Int : 1

       Op : +

       Float : 3.9

       Unknown : ;

       Var : a3

       Unknown : =

       Int :

       Op : /

       Int : 6

       Var : bcd

       Unknown : =

       Int : 4

       Op : %

       Int : 9

       Op : -

       Int :

       Line Count: 4

       这里就没有加-ll选项,但是可以编译通过。下面开始着重整理下Lex描述文件.l。

       二.Lex(Lexical Analyzar) 描述文件的结构介绍

       Lex工具是一种词法分析程序生成器,它可以根据词法规则说明书的要求来生成单词识

       别程序,由该程序识别出输入文本中的各个单词。一般可以分为<定义部分><规则部

       分><用户子程序部分>。其中规则部分是必须的,定义和用户子程序部分是任选的。

       (1)定义部分

       定义部分起始于 %{ 符号,终止于 %} 符号,其间可以是包括include语句、声明语句

       在内的C语句。这部分跟普通C程序开头没什么区别。

       %{

       #include "stdio.h"

       int linenum;

       %}

       (2) 规则部分

       规则部分起始于"%%"符号,终止于"%%"符号,其间则是词法规则。词法规则由模式和

       动作两部分组成。模式部分可以由任意的正则表达式组成,动作部分是由C语言语句组

       成,这些语句用来对所匹配的模式进行相应处理。需要注意的是,lex将识别出来的单

       词存放在yytext[]字符数据中,因此该数组的内容就代表了所识别出来的单词的内容。

       类似yytext这些预定义的变量函数会随着后面内容展开一一介绍。动作部分如果有多

       行执行语句,也可以用{ }括起来。

       %%

       title showtitle();

       [\n] linenum++;

       [0-9]+ printf("Int : %s\n",yytext);

       [0-9]*\.[0-9]+ printf("Float : %s\n",yytext);

       [a-zA-Z][a-zA-Z0-9]* printf("Var : %s\n",yytext);

       [\+\-\*\/\%] printf("Op : %s\n",yytext);

       . printf("Unknown : %c\n",yytext[0]);

       %%

       A.规则部分的正则表达式

       规则部分是Lex描述文件中最为复杂的一部分,下面列出一些模式部分的正则表达式字

       符含义:

       A-Z, 0-9, a-z 构成模式部分的字符和数字。

       - 指定范围。例如:a-z 指从 a 到 z 之间的所有字符。

       \ 转义元字符。用来覆盖字符在此表达式中定义的特殊意义,

       只取字符的本身。

       [] 表示一个字符集合。匹配括号内的任意字符。如果第一个字

       符是^那么它表示否定模式。例如: [abC] 匹配 a, b, 和C

       的任何一个。

       ^ 表示否定。

       * 匹配0个或者多个上述模式。

       + 匹配1个或者多个上述模式。

匹配0个或1个上述模式。

       $ 作为模式的最后一个字符时匹配一行的结尾。

       { } 表示一个模式可能出现的次数。 例如: A{ 1,3} 表示 A 可

       能出现1次或3次。[a-z]{ 5} 表示长度为5的,由a-z组成的

       字符。此外,还可以表示预定义的变量。

       . 匹配任意字符,除了 \n。

       ( ) 将一系列常规表达式分组。如:{ Letter}({ Letter}|{ Digit})*

       | 表达式间的逻辑或。

       "一些符号" 字符的字面含义。元字符具有。如:"*" 相当于 [\*]。

       / 向前匹配。如果在匹配的模式中的"/"后跟有后续表达式,

       只匹配模版中"/"前面的部分。如:模式为 ABC/D 输入 ABCD,

       时ABC会匹配ABC/D,而D会匹配相应的模式。输入ABCE的话,

       ABCE就不会去匹配ABC/D。

       B.规则部分的优先级

       规则部分具有优先级的概念,先举个简单的例子:

       %{

       #include "stdio.h"

       %}

       %%

       [\n] ;

       A { printf("ONE\n");};

       AA { printf("TWO\n");};

       AAAA { printf("THREE\n");};

       %%

       此时,如果输入内容:

       [root@localhost liweitest]# cat file1.txt

       AAAAAAA

       [root@localhost liweitest]# ./parser < file1.txt

       THREE

       TWO

       ONE

       Lex分析词法时,是逐个字符进行读取,自上而下进行规则匹配的,读取到第一个A字符

       时,遍历后发现三个规则皆匹配成功,Lex会继续分析下去,读至第五个字符时,发现

       "AAAA"只有一个规则可用,即按行为进行处理,以此类推。可见Lex会选择最长的字符

       匹配规则。

       如果将规则

       AAAA { printf("THREE\n");};

       改为

       AAAAA { printf("THREE\n");};

       ./parser < file1.txt 输出结果为:

       THREE

       TWO

       再来一个特殊的例子:

       %%

       title showtitle();

       [a-zA-Z][a-zA-Z0-9]* printf("Var : %s\n",yytext);

       %%

       并输入title,Lex解析完后发现,仍然存在两个规则,这时Lex只会选择第一个规则,下面

       的则被忽略的。这里就体现了Lex的顺序优先级。把这个例子稍微改一下:

       %%

       [a-zA-Z][a-zA-Z0-9]* printf("Var : %s\n",yytext);

       title showtitle();

       %%

       Lex编译时会提示:warning, rule cannot be matched.这时处理title字符时,匹配

       到第一个规则后,第二个规则就无效了。

       再把刚才第一个例子修改下,加深下印象!

       %{

       #include "stdio.h"

       %}

       %%

       [\n] ;

       A { printf("ONE\n");};

       AA { printf("TWO\n");};

       AAAA { printf("THREE\n");};

       AAAA { printf("Cannot be executed!");};

       ./parser < file1.txt 显示效果是一样的,最后一项规则肯定是会忽略掉的。

       C.规则部分的使用变量

       且看下面示例:

       %{

       #include "stdio.h"

       int linenum;

       %}

       int [0-9]+

       float [0-9]*\.[0-9]+

       %%

       { int} printf("Int : %s\n",yytext);

       { float} printf("Float : %s\n",yytext);

       . printf("Unknown : %c\n",yytext[0]);

       %%

       在%}和%%之间,加入了一些类似变量的东西,注意是没有;的,这表示int,float分

       别代指特定的含义,在两个%%之间,可以通过{ int}{ float}进行直接引用,简化模

       式定义。

       (3) 用户子程序部分

       最后一个%%后面的内容是用户子程序部分,可以包含用C语言编写的子程序,而这些子

       程序可以用在前面的动作中,这样就可以达到简化编程的目的。这里需要注意的是,

       当编译时不带-ll选项时,是必须加入main函数和yywrap(yywrap将下后面说明)。如:

       ...

       %%

       showtitle()

       {

       printf("----- Lex Example -----\n");

       }

       int main()

       {

       linenum=0;

       yylex(); /* 进行Lex分析 */

       printf("\nLine Count: %d\n",linenum);

       return 0;

       }

       int yywrap()

       {

       return 1;

       }

       三.Lex(Lexical Analyzar) 一些的内部变量和函数

       内部预定义变量:

       yytext char * 当前匹配的字符串

       yyleng int 当前匹配的字符串长度

       yyin FILE * lex当前的解析文件,默认为标准输出

       yyout FILE * lex解析后的输出文件,默认为标准输入

       yylineno int 当前的行数信息

       内部预定义宏:

       ECHO #define ECHO fwrite(yytext, yyleng, 1, yyout) 也是未匹配字符的

       默认动作

       内部预定义的函数:

       int yylex(void) 调用Lex进行词法分析

       int yywrap(void) 在文件(或输入)的末尾调用。如果函数的返回值是1,就停止解

       析。 因此它可以用来解析多个文件。代码可以写在第三段,这

       样可以解析多个文件。 方法是使用 yyin 文件指针指向不同的

       文件,直到所有的文件都被解析。最后,yywrap() 可以返回1

       来表示解析的结束。

       lex和flex都是解析Lex文件的工具,用法相近,flex意为fast lexical analyzer generator。

       可以看成lex的升级版本。

       相关更多内容就需要参考flex的man手册了,十分详尽。

       四.关于Lex的一些综述

       Lex其实就是词法分析器,通过配置文件*.l,依据正则表达式逐字符去顺序解析文件,

       并动态更新内存的数据解析状态。不过Lex只有状态和状态转换能力。因为它没有堆栈,

       它不适合用于剖析外壳结构。而yacc增加了一个堆栈,并且能够轻易处理像括号这样的

       结构。Lex善长于模式匹配,如果有更多的运算要求就需要yacc了。