如何编译支持在Windows2000下运行的Qt程序
2016-11-20 10:10
1241 查看
一、历程
这周接到一个软件开发任务,需要写一个界面程序,在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一下工程,然后重新编译。
三、下载地址:
Qt各个版本:http://download.qt.io/archive/qt/
MingW官网:http://www.mingw.org/
MingW3.2下载:http://download.csdn.net/download/zhangrenjing/4327989
这周接到一个软件开发任务,需要写一个界面程序,在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一下工程,然后重新编译。
三、下载地址:
Qt各个版本:http://download.qt.io/archive/qt/
MingW官网:http://www.mingw.org/
MingW3.2下载:http://download.csdn.net/download/zhangrenjing/4327989
相关文章推荐
- 图解如何将Ubuntu上的Qt程序交叉编译出可在ARM平台运行的程序(五部曲)
- Qt学习(如何交叉编译一个Qt程序使其能在板子上运行)
- Qt学习(如何交叉编译一个Qt程序使其能在板子上运行)
- Qt学习(如何交叉编译一个Qt程序使其能在板子上运行) .
- vs2008编译的程序如何在未安装vs的电脑上运行
- 如何让Qt程序只运行一次等
- 编译运行symbian程序(如何打开一个symbian工程)
- 如何在UltraEdit中编译和运行Java程序
- 扫盲贴 Visual Studio 2005/2008中如何编译和运行C++程序
- 如何从windows的command line运行Qt程序
- QT_win7下编译的程序在xp中运行中文乱码问题
- Windows XP 下使用命令行编译、运行 QT4 程序
- 用mingw编译C++工程;程序里面的cout<<"aaa";cmd运行c++程序,aaa内容在控制台不显示,如何将aaa输出到控制台屏幕并将控制台内容写到一个文件中。
- C#使用_如何在没有装VS(Visual Studio)的机器上编译运行C#程序
- 如何在unix下编译QT程序?
- 如何将双核电脑配置成仅运行单CPU(以便运行仅支持单CPU的程序)
- VS2005下如何安装配置编译并开发QT4.4.3程序
- 如何在Dos下编译和运行Java程序?
- VS2008不能自动绑定添加非控件变量,VS2010编译的程序不支持Windows2000
- 让非商业版的Qt编译的程序在任何电脑上运行