VS编译的QT程序发布时产生的AppCrash问题

至少我碰到了三个情况,都是AppCrash错误(以下都指VS2008的Release的设置)

第1个错误,报错模块是程序自己

我使用VS2008 Team with SP1和QT4.86编译程序,一直在本机上运行没什么问题,编译出的exe文件在别的机子上运行没问题(https发送有问题,但这是另外一回事)。后来VS2008 TEAM三个月试用期满,于是卸载掉换成ZWT的VS2008 PRO,打上补丁SP1。奇怪的是使用VS2008 PRO编译出来的程序会报AppCrash错误,程序登录界面都无法出来,莫名其妙之余也不想研究了,卸载PRO后重装TEAM,果然这个AppCrash错误消失了。但别的原因造成的AppCrash还在。

-------------------------------------------------------------------------------------

第2个错误,报错模块是ntdll.dll。后查明是由于VS2008项目属性没有设置好。

原来报错的原因是CRT库的错误选择,即Ingore Specific Library填写了msvcmrt.lib,Additional Dependencies 漏写了 libcmt.lib,导致虽然编译链接都通过,但执行有问题(登录没问题,使用外部库上传文件有问题)。 应该如下设置:

Linker的input页面,Additional Dependencies,应该设置为:
qtmain.lib QtCore4.lib QtGui4.lib QtXml4.lib QtNetwork4.lib msvcrt.lib (千万注意最后一项,不是msvcmrt.lib)
Ingore Specific Library应该设置为:
libcmt.lib (不是msvcrt.lib)

-------------------------------------------------------------------------------------

第3个错误,报错模块是程序自己(能出现登录框,但无法登陆,也无法从服务器获得XML应答,点击登录按钮后程序直接AppCrash了),且在安全网络模式下执行也是同样的错误。

问题签名:
问题事件名称: APPCRASH
应用程序名: bak61_AppCrash.exe
应用程序版本: 0.0.0.0
应用程序时间戳: 545c9b1b
故障模块名称: bak61_AppCrash.exe
故障模块版本: 0.0.0.0
故障模块时间戳: 545c9b1b
异常代码: c0000005
异常偏移: 000151bf
OS 版本: 6.1.7600.2.0.0.256.1
区域设置 ID: 2052
其他信息 1: 0a9e
其他信息 2: 0a9e372d3b4ad19135b953a78882e789
其他信息 3: 0a9e
其他信息 4: 0a9e372d3b4ad19135b953a78882e789

联机阅读隐私声明:
http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0804

如果无法获取联机隐私声明,请脱机阅读我们的隐私声明:
C:\Windows\system32\zh-CN\erofflps.txt

最后原因找到了:我去掉登录框的进度条的时候,去掉了new,却照常使用:
//remember_label = new QProgressBar();
remember_label->setVisible(true);
但最奇怪的是,在我本机上(开发机子),无论是VS直接生成运行,还是拷贝到本机别处生成运行,都没有问题,但是拷贝到别的机子上立即歇菜。但是为什么本机没事呢,难道什么地方对内存访问设置的更宽松了(网上搜的答案:软件级别的解决方案是加入DEP例外列表,网上评论一片叫好,可是我的程序被拒绝加入到这个列表)?我的机子装了Delphi 2010/XE/XE5和VS2005/2008/2010/2012。哪位大大知道还请告知。

-------------------------------------------------------------------------------------

总结:三个错误,其中2个都是自己对VS设置和相关类库不熟悉造成的,光觉得VS Studio IDE好用,不知道真正做项目时VS的编译器连接器里一堆坑,这还没算C++编译设置,特别是Code Generation的设置,另外还有Character Set对QString和Char*之间的转换有什么影响仍未清楚。第三个错误是自己使用未实例化的变量,当然出错,但是在本机上运行怎么样都不出错,也是百思不得其解。

备注:三个问题都与qt的dll无关,一开始千小心万小心dll,根本就是走错方向了,奇怪怎么也不见网上的QT前辈讲讲我碰到的那些问题?

上一篇:php对象


下一篇:C#中如何禁止WindowsMediaPlayer双击全屏显示