Qt4.6.2已编译二进制版本在VS2005中的问题

结论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),分别执行下列命令:

 

 

到目录“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已编译版),如果安装了,请先卸掉它,切记!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个简单的基于Qt 4.6.2的温度湿度折线图绘制示例代码: ```cpp #include <QtGui/QApplication> #include <QtGui/QWidget> #include <QtGui/QPainter> #include <QtCore/QList> #include <QtCore/QPointF> class TemperatureHumidityGraph : public QWidget { public: TemperatureHumidityGraph(QWidget *parent = 0) : QWidget(parent) {} protected: void paintEvent(QPaintEvent *) { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); painter.setPen(Qt::red); QList<QPointF> points; points << QPointF(50, 200) << QPointF(100, 150) << QPointF(150, 120) << QPointF(200, 100) << QPointF(250, 80) << QPointF(300, 70); // 绘制温度折线图 painter.drawPolyline(QPolygonF(points)); painter.setPen(Qt::blue); QList<QPointF> points2; points2 << QPointF(50, 150) << QPointF(100, 120) << QPointF(150, 100) << QPointF(200, 90) << QPointF(250, 80) << QPointF(300, 70); // 绘制湿度折线图 painter.drawPolyline(QPolygonF(points2)); } }; int main(int argc, char *argv[]) { QApplication app(argc, argv); TemperatureHumidityGraph graph; graph.show(); return app.exec(); } ``` 这段代码创建了一个`TemperatureHumidityGraph`类,它是一个继承自`QWidget`的窗口部件,重写了`paintEvent`方法用来绘制温度湿度折线图。 在`paintEvent`方法,我们首先创建了一个`QPainter`对象,并设置了抗锯齿属性和红色画笔。接着,我们定义了一个`QList<QPointF>`类型的变量`points`,它包括了一组温度数据的坐标点,这些坐标点用来构建温度折线图。 使用`QPainter`对象的`drawPolyline`方法可以根据坐标点绘制出一条折线图。同样的,我们定义了另一个`QList<QPointF>`类型的变量`points2`,它包括了一组湿度数据的坐标点,用来绘制湿度折线图。 最后,在`main`函数,我们创建了一个`TemperatureHumidityGraph`对象,并将其显示出来。 当程序运行时,会显示一个简单的温度湿度折线图窗口。你可以根据需要修改坐标点的值来实现更加复杂的折线图。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值