作者:庄晓立(Liigo)

日期:2012-6-19

原创链接:http://blog.csdn.net/liigo/article/details/7677507

转载请注明出处:http://blog.csdn.net/liigo/

易语言支持库的动态库(*.fne)和静态库(*_static.lib)通常是同一套源代码,往往动态库调试成功了,静态库也应该没有什么问题。但不怕一万就怕万一,我还就真的遇到了普通编译(使用支持库动态库)运行正常,而静态编译(使用支持库静态库)后运行异常。遇到这种情况只能单独调试静态库。一开始我也没找到调试易语言支持库静态库的办法,只是采用弹信息框(MessageBox)、写日志文件之类的原始手段,不过这种办法实在太笨了,要依靠它定位并解决bug除了祈求好运气别无他法。残酷的现实逼迫我(liigo)必须摸索出一套调试易语言支持库静态库的办法,功夫不负有心人,终于被我找到。具体操作步骤如下:

1、首先需要设置易语言静态编译参数,修改 <e>\tools\link.ini 文件,设置 show_command_line=yes,retain_intermediate_files=yes,删除相应行首的分号(;)。

2、编译支持库静态库的调试版(Debug版),覆盖<e>\static_lib\目录下的同名文件。注意,这里生成的静态库,应该使用resym.exe处理,参见易语言SDK\static_docs\。

3、用易语言编写一个程序,调用该支持库命令,然后静态编译。此时链接器可能会提示找不到 libcmtd.lib, libcpmtd.lib, libcimtd.lib 之类的C/C++运行库的Debug版,这是因为网上下载的 vc98linker 没有带调试版的库,不过没关系,我们去VC6安装目录去找,都可以找到,复制到 vc98linker 的 lib 目录就OK了。在易语言自动定位并采用本机安装的VC6链接器的情况下,不需要本步骤。

4、然后继续静态编译,链接器应该会提示 libcmtd.lib 和 libcmt.lib 两者存在符号冲突,静态编译失败。原因很好理解,我们的Debug版静态库要链接调试版的C运行库libcmtd.lib,而易语言核心库的静态库是Release版的,它要链接发布版的C运行库libcmt.lib。不过没关系,我们后面的步骤将通过给链接器附加命令行参数的方法予以解决。

5、由于我们先前第1步骤已经设置了“显示链接器命令行”( show_command_line=yes),所以在第4步的时候,易语言会输出链接器(linker)的命令行,大致如下:

"C:\Program Files\e\vc98linker\bin\link.exe" "E:\liigo\temp\bt_static.obj" "C:\Program Files\e\static_lib\krnln_static.lib" "C:\Program Files\e\static_lib\btdownload_static.lib" "C:\Program Files\e\static_lib\btdownload\gzip.lib" kernel32.lib user32.lib gdi32.lib winmm.lib msimg32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib "E:\liigo\temp\bt_static.res" /LIBPATH:"C:\Program Files\e\static_lib" /nologo /machine:I386 /subsystem:windows /out:"E:\liigo\temp\bt_static.exe"

把该命令行复制出来,粘贴到控制台窗口(开始 - 运行 - cmd.exe),然后在命令行后面多加一些参数,/nodefaultlib:libcmt.lib /pdb:"estatic.pdb" /debug /pdbtype:sept,如下:

C:\Users\liigo>"C:\Program Files\e\vc98linker\bin\link.exe" "E:\liigo\temp\bt_static.obj" "C:\Program Files\e\static_lib\krnln_static.lib" "C:\Program Files\e\static_lib\btdownload_static.lib" "C:\Program Files\e\static_lib\btdownload\gzip.lib" kernel32.lib user32.lib gdi32.lib winmm.lib msimg32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib "E:\liigo\temp\bt_static.res" /LIBPATH:"C:\Program Files\e\static_lib" /nologo /machine:I386 /subsystem:windows /out:"E:\liigo\temp\bt_static.exe" /nodefaultlib:libcmt.lib /pdb:"estatic.pdb" /debug /pdbtype:sept

这里解释一下:新增的参数 /nodefaultlib:libcmt.lib 是为了解决libcmt.lib与libcmtd.lib之间的符号冲突,如果还有其他库与libcmtd.lib有符号冲突,用同样的方式解决;新增的其他参数 /pdb:"estatic.pdb" /debug /pdbtype:sept 是为了给静态编译后的EXE添加调试信息,其中参数 /pdb:"estatic.pdb" 指定了要生成的调试文件的文件名(可带路径)。经我(Liigo)测试,即使这里指定的.pdb文件与最终编译生成的EXE不在同一目录也不是相同的文件名,VC6调试器也照样可以定位并加载该.pdb文件。所以我们不需要特别介意此处.pdb的路径和文件名;但话说两边,如果今后一旦调试器定位不到.pdb,我们应该回来修改 /pdb: 参数,指定一个与EXE在同一目录且主文件名相同的.pdb(具体到本例就是 /pdb:"E:\liigo\temp\bt_static.pdb")。

6、回车执行第5步骤的链接命令,于是静态编译成功了(如果一切顺利),我们得到了含有调试信息的EXE可执行程序。去哪里找这个EXE?就是第4步骤静态编译时你在易语言中输入的目录和文件名啊。

7、运行上一步骤生成的EXE程序,然后按系统热键 Ctrl+Alt+Del 打开任务管理器,找到该EXE进程,鼠标右键单击之,在菜单中选择“调试”,在接下来的确认对话框中点击“附加调试进程”(Attach to process)按钮,于是VC6启动并开始调试此EXE进程,它会自动定位并加载第5步骤中生成的.pdb调试信息文件。注意,本步骤要求事先设置VC6为系统JIT调试器,设置方法为:VC - Tools - Options - Debug,选中“Just-in-time debugging”。

8、通过VC6主菜单 File - Open 打开该支持库静态库的源代码文件,按 F9 设置断点,开始调戏程序吧XD。如果按F9无反应,无法设置断点,应该是第2步骤或第5步骤有误,回去检查一下,重来。

—— 全文完 ——

跟踪调试易语言静态编译支持库的方法相关推荐

  1. 易语言静态编译链接器大全(为EIDE助手准备滴)

    点击阅读原文 本文中的各个链接器收集于网络,汇总在一起,方便广大易友下载使用: 易语言的大部分支持库是 使用 vc6 编译, 所以, 推荐大家使用 vc6的链接器: 如果使用 其他链接库编译出现问题, ...

  2. 再议易语言静态编译重定位数目过多

    20180629 Liigo 补记:此问题已得到完美解决,详见本文最后一节<皆大欢喜>. 0.问题再现 数日之前有朋友联系我,说他的软件静态编译后无法正常启动,已经困扰了三天,多方求助,最 ...

  3. 易语言静态连接器提取_易语言静态编译链接器切换工具

    使用说明 将exe程序和"链接器目录配置.ini"文件,复制到易语言安装目录的"tools"文件夹下 并且对"链接器目录配置.ini"进行修 ...

  4. 易语言linux静态编译失败,易语言静态编译出现错误求解决

    静态编译程序的时候出现这个... 开始静态链接... LIBC.lib(crt0dat.obj) : error LNK2005: __cinit already defined in libcmt. ...

  5. 易语言MySQL静态编译,我说易语言静态编译太强大……

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 编译后的文件在virscan有14款软件误报 静态编译后我和我的小伙伴惊呆了-- NOD32你别逗我,玷污了这2%,求大神NOD32的报毒信息是怎么回事 ...

  6. 易语言 PDF 制作支持库

    下载地址: http://download.csdn.net/detail/u012607841/8263021 有了这个支持库,大家就能随心所欲的 制作pdf文件了. 使用 libharu 开源库 ...

  7. 易语言WEB开发支持库正式发布

    WEB开发支持库 (2.191118#51版) 本支持库实现了开发CGI ISAPI程序支持支持20个扩展类别与库定义数据类型 每类别最多25个函数 超出函数占用下个类别序号地址     全局类别与库 ...

  8. 易语言隔行扫描算法 支持库

    从gh0st里面提取出来的, 隔行扫描算法,占用cpu极小 高效的屏幕传输利器 下载地址: http://download.csdn.net/detail/u012607841/8263053

  9. 【转】C语言如何编译动态库与静态库?

    因为是别的论坛,不能直接转载,自己在这里再粘贴一下-- 转载网址:https://www.2cto.com/kf/201711/699202.html 关于动态库与静态库的作用这里就不在详细赘述了,重 ...

  10. Qt 4.7.4 完美动态编译发布动态调试,以及静态编译发布

    首先是准备工作,去QT主页下载独立的QT类库安装包以及完整QT SDK安装包,还有QT Creator for windows 版 下载地址:http://qt.nokia.com/downloads ...

最新文章

  1. DPDK 中断机制(二十六)
  2. 判断脚本,图片,CSS,iframe等是否加载完成
  3. Java笔记-JDK搭建WebService客户端其他调用方法
  4. 开源大法好,Windows 计算器又添两项新功能
  5. IIS组件搭建ftp服务器
  6. 标准模板库(STL)学习探究之Multimap容器
  7. AWT_Swing_图标按钮(Java)
  8. EEG公开数据集汇总
  9. matlab 分式拟合,如何用matlab拟合微分方程
  10. 复制EXCEL单元格的值到SpreadJs单元格中,会多加一个可见的空格和一个不可见的0宽度空格的解决方法(ie11)
  11. 【软件工程】三、软件开发方法学——结构化分析方法
  12. MUI 的侧滑菜单 详解
  13. 三维分子图的球面信息传递
  14. python的浅拷贝和深copy
  15. PS钢笔--制图抠图
  16. 【UE4】给游戏制作一个简易的小地图
  17. 清华大学邓俊辉-数据结构MOOC笔记-树的概念及逻辑表示
  18. STM32 B3 B5 A13 A14 A15端口复用
  19. 【研一小白的白话理解】pytorch-CycleGAN-and-pix2pix
  20. echarts关系图配置详解

热门文章

  1. 中南大学-大学生心理健康教育-MOOC/雨课堂-图片版答案(期末测试)
  2. vwmare 15“无权输入许可证密钥...”与出现新问题hadoop集群无法启动
  3. LaTeX中常用的模板,命令和技巧
  4. 在线式极限学习机OS-ELM
  5. matlab 画图 浓淡有别,matlab画图命令汇总
  6. 电脑ps4,人在外心在家,教你用PC/MAC远程打PS4
  7. 声道测试音频_AirPods Pro 空间音频的这7个问题,你都了解吗?
  8. 分布式系统负载均衡策略分析与研究
  9. 学习BMFONT的感想
  10. Unity基础——碰撞体