结论1:
如果你想把Qt4.6.2安装在VS2005中,又不想花时间编译,请下载和安装qt-win-opensource-4.6.2-vs2008,并单独编译“QT安装路径/src/winmain/”

结论2:
在安装qt-win-opensource-4.6.2-vs2008(msvc9/vs2008已编译版)之前千万不要安装qt-sdk-win-opensource-2010.02.1(miniGW已编译版),如果不幸安装了,请先卸掉它,切记!

问题描述及解决过程:

我在Nokia的QT官方页面下载了QT的最新版本(Windows平台下已编译的安装版本,安装文件名称为:qt-sdk-win-opensource-2010.02.1.exe),安装后发现是miniGW版本(即Windows下的GCC编译版本,库文件是*.a和*.so),并不适合于msvc编译器。

没办法,再到Nokia的QT官方下载页面(好多个版本,我都不知道它们之间的区别),找到专用于VC编译器的已编译二进制版本(安装文件名称为:qt-win-opensource-4.6.2-vs2008.exe)。安装文件名标明了VS2008(只能用于VS2008?),而我的机器上安装的是VS2005,不管了,装了再说。于是,我的痛苦经历来了!

安装过程倒很顺利。装完后建了个测试工程,发现Release配置下编译链接运行都正常,但在Debug下链接通不过,提示:
qtmaind.lib(qtmain_win.obj) : fatal error LNK1103: 调试信息损坏;请重新编译模块

初步估计这个静态库是用msvc9编译出来的,用msvc8的链接器链接它,链接器不干了!没关系,重新编译这个静态库嘛,不费劲。在开始菜单打开“Visual Studio 2005 命令提示”命令行窗口,切换当前路径(cd)到“D:/Qt/4.6.2/src/winmain”(注意我的QT安装路径是D:/Qt/4.6.2),分别执行下列命令:

  1. rem 生成工程的makefile文件
  2. qmake winmain.pro
  3. rem 生成静态库
  4. nmake

到目录“D:/Qt/4.6.2/lib”下检查,发现qtmain.lib和qtmaind.lib两个文件已经更新了,就是说,这两个库已经是msvc8/vs2005生成出来的了。

再在例子工程中选Debug模式生成,链接成功了!激动!但很快就被拨了冷水——调试运行时,弹出程序在某内存处运行出错的窗口,程序崩溃了。怎么办?例子工程肯定是没问题的,崩溃代码应该出现在qtmaind.lib库中。

仔细分析qtmaind.lib的源代码($QTDIR/src/winmain/),它只有一个函数,就是大名鼎鼎的WinMain函数!我们知道,CRT运行时库将调用WinMain函数开始Windows下的窗体程序运行。这个WinMain函数也不复杂,就是先调用qWinMain()初始化QT环境,然后检查系统中有没有该程序的进程,有的话就不启动了,这样能确保程序只能有一个实例;最后调用main(),就是我们Qt例子工程中的main函数,真正启动程序。

我在qtmaind.lib工程的WinMain函数开始处添加“弹出一个MessageBox”的代码,目的是测试程序有没有运行到这里。我失望了,Debug下没有运行到WinMain,程序就崩溃了。(Release下确实先弹出了这个消息框才运行程序)

就是说,在WinMain之前,程序就崩溃了。难道是MS-CRT运行库的入口函数(CRTStartUp?)有问题?或者QT中用了全局对象,出题出现在全局对象的构造函数?很有可能。

到这里,已经超出了我的能力范围,我不能跟下去了。没办法,只得重新编译整个QT!

编译QT的时间是很长的,动不动就几个钟,这都还可以接受了。但是,编译过程总是出现错误,最后强制nmake所有模块,忽略编译中出现的错误。终于编译好了,测试,Debug下问题依旧——崩溃,又见崩溃!怀疑编译过程不顺利造成了,试着找另一个版本的源代码(qt-sdk-win-opensource-2010.02.1)再重新编译,问题依旧,怀疑真不能在VS2005下使用了。就这样搞了我好几天!!!

今天把VS2008也装上了,结果在Debug下运行仍然崩溃,但提示不同了,找不了某某某链接符号。

然后我把qt-sdk-win-opensource-2010.02.1(miniGW已编译版)和qt-win-opensource-4.6.2-vs2008(msvc9/vs2008已编译版)都卸了,重启,再重新装上qt-win-opensource-4.6.2-vs2008,再用msvc8/vs2005重新编译qtmain.lib静态库,居然发现,一切问题解决了!

结论:
在安装qt-win-opensource-4.6.2-vs2008(msvc9/vs2008已编译版)之前千万不要安装qt-sdk-win-opensource-2010.02.1(miniGW已编译版),如果安装了,请先卸掉它,切记!

http://blog.csdn.net/flyoxs/article/details/5604626

Qt4.6.2已编译二进制版本在VS2005中的问题的更多相关文章

  1. geos 3.6.3库windows版本 已编译完成的32位版本和64位版本

    网上教编译方法的很多,直接分享编译完成的很少. 我就把编译完成的分享出来吧. ​geos-3.6.3.tar.bz2 (Changes) 版本的 https://trac.osgeo.org/geos ...

  2. Linux安装mariadb二进制版本

    上一篇说了mariadb编译安装过程,但在生产环境中一般使用发布好的二进制版本,由于安装过程和之前一样,不再详细叙述,只是简单概括一下安装过程: 1. 下载 地址为:https://downloads ...

  3. MySQL入门02-MySQL二进制版本快速部署

    在上篇文章 MySQL入门01-MySQL源码安装 中,我们介绍了MySQL源码安装的方法. 源码安装虽然有着更加灵活和更加优化等诸多优势.但源码编译安装部署的过程相对复杂,而且整个过程所花费的时间很 ...

  4. hi3531 SDK已编译文件系统制作jffs2文件系统镜像并解决问题 .

    一, 安装SDK 1.Hi3531 SDK包位置 在"Hi3531_V100R001***/01.software/board"目录下,您可以看到一个 Hi3531_SDK_Vx. ...

  5. MySQL免编译二进制包安装简记

    相比较于MySQL的源代码安装来说.免编译二进制包的速度实在是快了太多,而且性能损失也不是很大,同时具有一定的定制性.所以,如果没有特殊的 需求,尽量用MySQL免编译二进制包来安装MySQL. 1. ...

  6. opencv在vc2010 express下环境搭建方法笔记+空白通用工程(已编译测试通过)(提供下载)

    opencv在VC2010 express版本下的环境搭建可以参见下面的wiki,这里面讲的非常清楚. http://wiki.opencv.org.cn/index.php/VC_2010_Expr ...

  7. 在 CentOS 7 中以命令行方式安装 MySQL 5.7.11 for Linux Generic 二进制版本

    MySQL 目前的最新版本是 5.7.11,在 Linux 下提供特定发行版安装包(如 .rpm)以及二进制通用版安装包(.tar.gz).一般情况下,很多项目都倾向于采用二进制通用安装包形式来进行安 ...

  8. VS2005 编译 Qt4.8.2库,并修正源码中的错误

    从昨天开始利用VS2005对Qt4.8.2库进行编译,在编译到某个文件时,总是报错,提示VS的cl.exe和nmake.exe返回致命错误.错误罗列如下: DefaultLocalizationStr ...

  9. centos 6.5 下安装RabbitMQ-3.7.28 二进制版本

    centos 6.5 下安装RabbitMQ-3.7.28 二进制版本 安装依赖: yum install -y ncurses-devel socat logrotatewxWidgets-deve ...

随机推荐

  1. 关键字 const

    如果关键字出现在星号左边,表示被指物是常量: 如果出现在星号右边,表示指针本身是常量: 如果出现在星号两边,表示被指物和指针都是常量. void f1(const Widget* pw); //f1和 ...

  2. Poj OpenJudge 百练 2632 Crashing Robots

    1.Link: http://poj.org/problem?id=2632 http://bailian.openjudge.cn/practice/2632/ 2.Content: Crashin ...

  3. [java学习笔记]java语言核心----面向对象之static关键字

    static关键字用处 用于修饰成员变量和成员函数 被修饰后的成员具有以下特点: 随着类的加载而加载 优先于对象存在 被所有对象所共享 可以直接被类名调用 使用注意 静态方法只能访问静态成员:非静态方 ...

  4. Dribbble客户端应用源码

    简约大气的Dribbble客户端,帮你时刻紧跟潮流,版本描述,添加对Likes & Following的支持设计简约的Dribbble客户端,提供了全面的浏览功能,让你时刻紧跟潮流! A BE ...

  5. Kail安装Parallels tools

    今天在安装虚拟机里面安装kail,在安装虚拟机提供的tools时候提示没有权限,如图: 后面经过自己证实首先tools是挂载的cdrom,在这样挂载下是没有写权限的(类似于windows下面读取光盘光 ...

  6. 构造函数继承关键apply call

    主要我是要解决一下几个问题: 1.        apply和call的区别在哪里 2.        apply的其他巧妙用法(一般在什么情况下可以使用apply) 我首先从网上查到关于apply和 ...

  7. 【转】M0,M1,M2,M3,M4基本概念

    在金融学中的M1,M2,M3,M4都是货币层次的划分M0= 流通中的现金;M1=M0+ 个人信用卡循环信用额度+ 银行借记卡活期存款+ 银行承兑汇票余额+ 企业可开列支票活期存款;M2=M1+ 个人非 ...

  8. event事件:

    onabort: 图像的加载被中断onblur: 元素失去焦点onchange: 域的内容被改变onclick: 当用户点击某个对象时调用的事件句柄ondblclick: 当用户双击某个对象时调用的事 ...

  9. 如何利用VS2010安装和部署应用程序

    转自:http://jingyan.baidu.com/article/4b52d70255d7f0fc5d774b4d.html 1.假设你当前的winform已经okay了 2.解决方案中新建&q ...

  10. Python学习_算数运算函数

    记录以grades列表为例,分别定义输出.求和.平均值.方差和标准差函数,并输出相应的值 grades = [100, 100, 90, 40, 80, 100, 85, 70, 90, 65, 90 ...