如何编译支持在Windows2000下运行的Qt程序

一、历程
这周接到一个软件开发任务,需要写一个界面程序,在windows2000下运行。一开始,我想得很简单:window2000和XP应该是差不多的,只要在XP下能运行的,windows2000下也不会有太大问题。用Qt写界面,又快又好,就这么愉快地决定了!
结果,花了两天时间写完代码,在XP虚拟机系统上测试没问题后,拿到windows2000下一运行:
无效的win32程序! 生气
这就奇也怪哉了!明明是在win32下编译的程序,怎么在windows2000下就不认了?
没办法,只能问度娘。果然,有人遇到了这样的问题,不过别人的不是Qt程序,而是VS2010编译的程序不能运行。因为VS2010编译的Qt库中用到了较新的kernel32.dll,里面用到了两个函数DecodePointer和EncodePointer,而在windows2000中的kernel32.dll这两个函数不存在,所以会出现这种现象。
对的,我用的就是vs2010版本的Qt4.8.6,应该是这个原因。我用Depens.exe查看了QtCore4.dll的依赖项,依赖的kernel32.dll中真有这两个函数。那我不用VS2010编译的Qt总可以了吧?正好我的电脑上还安装了Qt5.4的mingw版本,可以避开VS2010的编译库。
编译好了以后,拿到windows2000下运行:
无法定位程序输入点GetGeoInfoW于动态链接库KERNEL32.dll。 快哭了

还是不行,mingw版本的qt5用到了kernel32.dll中的GetGeoInfoW函数,这也是windows2000下没有的。看来,问题比我当初想象的棘手得多。难不成还要在windows2000下用qt源代码重新编译一下?那也太麻烦了,应该还有别的方案的。
既然是高版本的Qt用到了较新系统的核心库,那是不是早期的Qt有可能没有用到这些函数呢?抱着这种期望,我开始寻找低一点版本的Qt。一开始找到的是Qt4.2,但是那个时候没有对应的Qt Creator问世,新版的Qt Creator又不识别Qt4.2,不能使用。
于是搜索Qt Creator1.0的新闻,发现原来Creator1.0和Qt4.5是一起面世的。好!把这两个家伙一起下载,安装。Qt Creator的安装还比较顺利,Qt4.5就不那么容易了。因为那个时候还没有开始使用VS的编译器(其实我也不希望使用VS编译器,不然有可能回到之前的问题上),只能使用mingW编译器,而且要求必须是3.2版本的。Qt4.5的安装过程倒是有自动下载安装mingw的选项,不过可能是时间太久,资源地址已经迁移了,无法下载。尽管Qt4.5的安装可以跳过这一步,但如果不使用正确的mingw版本,Qt程序是无法正确编译的。
没办法,只能自己下载安装。mingw官网倒是有比较方便的下载工具,一键式下载安装,但是下载的是最新版本,仍然无法编译出Qt程序。
幸运的是,上网直接搜索mingw3.2版本,有人已经在CSDN上上传了。下载下来安装,终于,Qt4.5可以正确编译了。赶紧把编译好的程序放到windows2000虚拟机下运行,bingo!成功!因为界面程序是在4.8.6上编写的,而Qt4.5和Qt4.8同属一个大版本,没有太大的代码改动,所以很快就可以编译出在windows2000下运行的界面程序了。
二、总结
1 使用高版本的Qt4.8.6以上,用到了kernel32.dll中的某些函数,在windows2000下的kernel32.dll中是没有的。其中,
(1)VS2010版本的Qt4.8.6用到DecodePointer和EncodePointer;
(2)mingW版本的Qt5.4用到了GetGeoInfoW。
2 Qt的早期版本都用到了mingW编译器,对应使用版本要对应。
另:在下载网址查看后发现,从Qt4.6开始,有了VS2008编译器编译的版本,应该能够避开DecodePointer和EncodePointer的问题,但是不知道能否避开GetGeoInfoW的问题。
3 老版的Qt Creator有不少不完善的地方,比如代码补全、编译错误提示、函数定义查找等,均有不方便使用之处。当发现编译通不过,又找不到问题所在时,可以尝试qmake一下工程,然后重新编译。


三、下载地址:
MingW官网: http://www.mingw.org/

猜你喜欢

转载自blog.csdn.net/stonylhy2011/article/details/53239304