在看编译原理,看到了Lex这一节。网上搜发现,Parser Generator作为当前最好用的Windows环境LEX/YACC工具而被广泛应用。
于是想学着用一下PG。
没想到配置的问题就折腾了一天,不过收获还是很多的。
参考资料:
http://blog.csdn.net/itic3721/article/details/6225866
相当感谢这位作者的帮忙,不过也有些小问题。
实验目标:
在VS2008中编译PG2库,使两者能结合使用。
实验过程:
1、从网上下载了PG2,安装。
2、按照上面网址的做法一步步做
1)下载Parser+Generator+2.rar,经过改动的ParGen文件,在libbuilder里可以选择VS2008
注:放在另外一个文件夹。其实就是用一下改动后的配置文件。默认情况下,编译后的文件还是放在1中的安装文件夹中。
2)按照http://dev.firnow.com/course/3_program/c++/cppjs/200798/70287.html这个页面设置bin、lib、include
注:这一步没有做,因为URL已经失效了。
3)把source里面的yywspdbg.c、yywspvar.c、yyasldbg.c、yyaslvar.c、yyaspdbg.c、yyaspvar.c、yydllm.c、yywsldbg.c、yywslvar.c扩展名改成.bak(也就是把这几个源文件废了.)
3、开始编译。选项如下:
Compiler Version: vs2008
Unicode: True
Treat wchar_t as built_in type:true;
Compiler Bin Directory: C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO 9.0\VC\BIN
Compiler Bin Directory(2): C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO 9.0\COMMON7\IDE
Compiler Include Library: C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO 9.0\VC\INCLUDE
Compiler Include Library(2): C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO 9.0\VC\ATLMFC\INCLUDE
Compiler Include Library: C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO 9.0\VC\LIB
Compiler Include Library(2): C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO 9.0\VC\ATLMFC\LIB
编译成功。
4、尝试编译例子calc。
在PG中生成myparser.h和myparser.c后,导入到vs2008的新建空项目中。
设置VC++目录中的各种路径:库文件,包含文件,源文件。(就是将pg2安装文件夹下的各种路径导进来了)
设置C/C++->预处理器->预处理器定义:YYDEBUG
链接器->输入->附加依赖项:ylmtrd.lib
C/C++->预处理器->运行库:Mtd(和ylmtrd.lib对应!!很重要!!)
开始运行。
5、发现错误
error LINK2001(或2019):无法解析的外部符号:
_yytop, _yyparse......
6、解决方法:
仔细看了代码
#include <yypars.h>
在yypars.h能找到以上的"无法解析的外部符号"的声明,但是定义为什么不见了?
用dumpbin工具导出ylmtrd.lib的函数内容到txt,查找以上的外部符号,也找到声明了。
但为什么链接时候找不到定义了?
回头看了参考网址中的方法:
“把source里面的yywspdbg.c、yywspvar.c、yyasldbg.c、yyaslvar.c、yyaspdbg.c、yyaspvar.c、yydllm.c、yywsldbg.c、yywslvar.c扩展名改成.bak(也就是把这几个源文件废了.)”
可能是这里出了问题?把一些符号或者函数的定义给“注释”掉了?
于是尝试这把这些文件的后缀改成cpp,重新编译
编译到yydllm.cpp的时候出现yyinit()和yydelete()的错误.但这是在生成某个dll的时候出错的,而我目前只用静态库,不用dll。所以不管这些问题
编译结束后,重新在vs2008下build
出现一些错误:
符号重定义,和LIBCMTD.lib冲突了
在忽略特定库中,写上LIBCMTD.lib
然后build,成功了
收获:
1、对vc的配置又重新弄了一遍,还有静态库的一些知识。
2、中间还尝试用nmake编译例子,参考网址中下载的文件中已经包含了makefile文件,但是一直没有成功。有时间要好好琢磨一下nmake和makefile
3、知道了一个道理:网上的攻略教程不一定可靠,还是要自己好好动脑筋,多动手。碰到问题,就去努力解决。
以上是今天的体会心得。谢谢网上丰富的资料。
大家有任何建议,不妨提出来,多多交流,互相促进。