今天在编译课上第一次接触了有关flex的一些词法分析器的编程。下课后就开始时间。期间遇到一些问题,记录下来以备忘。根据老师的说法:
1.通过path 设置号gcc的环境变量。
我找到了codeblocks的minGW的路径C:\Program Files (x86)\CodeBlocks\MinGW\bin
2.下载并解压flex_bin 和flex_lib以备用
3.编写.l文件(.l和.L是一样的)
%{
int digitsnum=0;
%}
DIGIT [0-9]
DIGITS {DIGIT}+
%%
{DIGITS} {printf("get a number\n");digitsnum++;}
%%
int main()
{
yylex();
printf("the sum of numbers is %d\n",digitsnum);
return 0;
}
这是我写的一段小程序,用于探测数字的个数(第一行是先%后{)
4.使用flex处理.l文件
通过cd命令进入flex的目录下,将.l文件拷贝到flex的目录下,然后处理
在这之后会在目录下生成lex.yy.c的C文件
5.用gcc 编译lex.yy.c来生成在windows下的exe文件
在这里,处理时碰到了一个问题,就是不知道怎么把静态库lib通过gcc指令链接到编译的过程中。通过查阅资料,这个问题得到了解决:
资料:
http://blog.163.com/jiangh_1982/blog/static/1219505200971413544680/
资料摘要
编译链接:
gcc -o hello main.c -static -L. –lhellos
下面是关于上面命令的解释:
库依赖
使用-I参数可以向gcc的头文件搜索路径中添加新目录。
gcc hello.c -I /home/wuzhiguo/include -o hello
使用-L参数可以向gcc的库文件搜索路径中添加新目录。
gcc hello.c -L /home/wuzhiguo/lib -l mylib -o hello
-l mylib 是指示gcc去链接库文件libmylib.so。Linux下的库文件有一个约定,全部以lib开头,因此可以省去lib。
动态库:.so结尾,在运行时加载。
静态库:.a结尾,在编译时加载。
默认gcc优先加载动态库,可以在通过-static选项强制使用静态链接库。
gcc hello.c -L /home/wuzhiguo/lib -static -l mylib -o hello
所以-L后面的点为当前目录,-l后面是要静态连接的库(libhellos.a)
所以,问题得到了解决:
6.最后运行a.exe即可
7.看一看最后的文件目录
初学编译原理,开头难,慢慢来。