zoukankan      html  css  js  c++  java
  • vs2008编译ParserGenerator2库

    在看编译原理,看到了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、知道了一个道理:网上的攻略教程不一定可靠,还是要自己好好动脑筋,多动手。碰到问题,就去努力解决。

    以上是今天的体会心得。谢谢网上丰富的资料。

    大家有任何建议,不妨提出来,多多交流,互相促进。

  • 相关阅读:
    OSG中的示例程序简介(转)
    空间点到直线垂足坐标的解算方法 (转)
    OpenscenGraph中控制swapbuffer的方法(用于多机大屏幕同步显示机制)
    吏治 ? 官治 ?
    C++中使用union的几点思考(转)
    一个穷人移民美国三年的生活经历(转)
    展望99股市:谁是重组大黑马?(转)
    mysql 在一个实例运行情况下再搭建一个实例
    在CentOS下安装crontab服务
    Zabbix监控之迁移zabbix server
  • 原文地址:https://www.cnblogs.com/chenhuanfa/p/2732798.html
Copyright © 2011-2022 走看看