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

80 篇文章 6 订阅
67 篇文章 1 订阅

作者:庄晓立(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步骤有误,回去检查一下,重来。

—— 全文完 ——


ex_ui支持界面2017.02.26 3编辑框 各列表框组件执行命令增加 设定Unicodeex文本返回 设定 设定后 内容和 结束编辑文本 属性 均会返回unicodeex文本 方便使用unicode 4解决部分繁体系统不显示文本 18所有列表框虚表增加2种实时回调方案 目前共计三种虚表模式 之后会推出新增的两种历程 1dep的问题 2修正选色板事件触发 4修正颜色选择器和日期选择器返回值 20除普通列表框外(因为他普通嘛)所有列表框插入自绘接口元素方案 和 纯色元素方案 10列表类组件增加设置背景颜色接口 超级列表框 和 普通列表框  新增表项状态模式 项目背景方案, 整数型, , , 0 使用皮肤 1使用_子项目独立皮肤 2使用背景色_列1背景色 3使用背景色_列1背景色仅普通状态  4使用背景色_子项目独立背景色 5使用背景色_子项目独立背景色仅普通状态 指定背景色后 列表不再处理热点和选中背景 用户通过事件 更改颜色 整行选择时 用第一列的背景颜色 非整行时用独立颜色 空白不绘制留空 图标列表框和树形列表框 因为可以随意插入重叠元素 增加个纯色元素即可 8对选择夹皮肤与代码做细节处理 皮肤附加属性 新增选中突出 属性 0 不突出 >0为绝对像素 小于0 为 子夹头宽或高/10*取绝对值(选中突出) 不再依赖素材透明度  让制作皮肤更简单 对多子夹头模式兼容更完美 14对工具条的插入按钮增加 插入菜单按钮(两种样式)和插入状态条按钮(4种样式) 新增边缘边缘剪辑属性 用以在做菜单条或状态栏靠近窗体边框时裁剪边线 工具条按钮增加内容 居左 居中 居右控制功能 以上改动让工具条更加强大!可以轻松实现 顶部菜单条和 底部状态栏 样式 12窗口ex样式方案 新增 底图图边框9 和颜色无边框 10 以上两种方案 组件可以越界到非客户显示 13 窗口执行命令新增背景绘制回调接口 可通过此接口 实现部分特殊效果 如对窗口背景进行处理 或者背景动画 9 增加 命令置exui消息回调 用以在exui遇到不确定的动作时通知程序  初步设计功能有 1 字体加载时若系统无字体通知                    用户可在此安装或指定字体文件 参数1 消息类型 201 参数2 unicode 字体名称 指针 参数3 int 参考 用于返回新的字体名称 参数4 保留 返回值 int 返回0 由exui核心自行寻找匹配字体 返回1 代表字体已安装处理完毕 核心重新调用创建函数创建字体 此时 无论是否创建成功 都不再调用回调 如果失败 核心则继续匹配字体 返回2 代表更改字体名称 核心从参考返回指针 调用创建字体  (此处需要unicode 编码) 2 运行时缺少必须的依赖文件                     用户自处理来源 wke 浏览框 启动时 判断wke是否已载入 没有则 在运行目录寻找wkedll 如果未找到 调用通知 参数1  消息类型 202 参数2  unicode 文件名(全路径)  指针 参数3  int 参考 用于返回新的文件名 参数4  保留 返回值  int 返回0 有exui核心自行处理wke丢失问题 返回1 代表wkedll 文件已经写入到指定路径 核心重新调用载入命令引用 wkedll 返回2 代表更改文件路径 核心从参考返回值指针 载入引用 dll (此处需要unicode 编码) 3 wke 加载后 询问注册js (可能需要加独立的注册命令) wke 首次载入时 调用 参数1  消息类型 203 参数2  保留参数 参数3  保留参数 参数4  保留 返回值  int 扩展组件同步更新 修正 曲线图 柱状图 纵轴最小值 =0时 不能显示的问题 21内部字体加载和绘制接口更改理论上会加快启动速度已完成 开放调用exui绘制文本接口 重新规划 编辑框 字符输入 输入法 文本输入 某键按下 和 弹起 的 附加参数1 和附加参数 --------- 按下弹起 附加消息1 字符码 附加消息2  -1 or 1            窗口消息=附加消息2 字符输入 附加消息1 字符代码  附加消息2 -1 -2            窗口消息=附加消息2 输入法文本输入  附加消息 1 2048 附加消息2 窗口句柄      窗口消息=附加消息1 新增命令 组件取事件附加参数 (用于获取 以上事件的 附加信息) 扩展组件 修正 曲线图 柱状图 最小值 小于0 时 不现实文本的问题 增加 4个 unicode 和 ansi 的互相转换命令 2扩展接口 扩展组件 同步更新 扩展接口 新增 字体绘制 和皮肤绘制接口  因属于接口部分 同时 又直接作用于 扩展绘制组件 故不直接在内开放 对 菜单 和图片组的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值