初次接触flex的编程与问题解决(有关gcc的静态库链接)

今天在编译课上第一次接触了有关flex的一些词法分析器的编程。下课后就开始时间。期间遇到一些问题,记录下来以备忘。根据老师的说法:

 

1.通过path 设置号gcc的环境变量。

我找到了codeblocksminGW的路径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.soLinux下的库文件有一个约定,全部以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.看一看最后的文件目录


初学编译原理,开头难,慢慢来。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值