现在是2021年2月,我们的客户还有大约不到40%的机器还在使用windows xp系统,QT最后支持windows xp系统的版本是5.6.3,但是想要将编译出来的程序在windows xp里面成功跑起来还是要费一番功夫的。
先说几个重点吧,第一是一定要把QT源码的目录名称改短,否则qwebp.lib会无法编译生成(原因是什么vckg限制了路径字符长度,看这里https://bugreports.qt.io/browse/QTBUG-38210),但是很奇怪qwebpd.lib也就是debug版本的可以生成。第二是尽量使用vs2010进行编译,虽然2015,2019等都能编译成功,但是实际用的时候在xp下面还是有各种问题。
下面是路径过长无法编译libwebp的出错提示,编译alpha_processing_sse2.obj时失败了。

1.QT 5.6.3源码获取
https://download.qt.io/new_archive/qt/5.6/5.6.3/ 找到single目录内的zip格式压缩包下载使用。
2.修改静态编译参数
修改qtbase\mkspec\common\msvc-desktop.conf文件,修改里面的
QMAKE_CFLAGS_RELEASE = -O2 -MD
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MD -Zi
QMAKE_CFLAGS_DEBUG = -Zi -MDd
改为
QMAKE_CFLAGS_RELEASE = -O2 -MT
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MT -Zi
QMAKE_CFLAGS_DEBUG = -Zi -MTd
3.编译icu,openssl,我之前的博客里面写过,不再赘述。注意支持xp的版本问题icu 49.1.2,openssl 1.02u可以,高了不行。
4.最重要的一个环节,指定编译参数
我这里是使用vs2010在windows 7系统下面编译的,需要注意几个特殊的编译参数,第一个是CL参数,如下
set PATH=C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Bin;%PATH%
set INCLUDE=C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include;%INCLUDE%
set LIB=C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include;%LIB%
#set CL=/D_USING_V140_SDK71_
CL=/D_USING_V140_SDK71_的意思是让vc2015使用xp工具集,需要在编译前确定本机安装了xp工具集。我之前尝试使用vs2015编译时配置的参数,后期使用vs2010编译就可以不要了。
第二个重要的参数是-target xp,我的完整编译批处理脚本内容如下:
call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86
set OPENSSL_DIR=D:\cpp_tools\OpenSSL-1.0.2u-Static-XP\OpenSSL
set PATH=%PATH%;C:\icu\dist\bin;
set INCLUDE=%INCLUDE%;C:\icu\dist\include;D:\cpp_tools\OpenSSL-1.0.2u-Static-XP\OpenSSL\include;
set LIB=%LIB%;C:\icu\dist\bin;D:\cpp_tools\OpenSSL-1.0.2u-Static-XP\OpenSSL\lib;
set LIBPATH=%LIBPATH%;C:\icu\dist\lib;D:\cpp_tools\OpenSSL-1.0.2u-Static-XP\OpenSSL\lib;
set libs.icu=-lsicudtd -lsicuind -lsicuucd -lAdvapi32
set ICU_PREFIX=C:\icu\dist
SET QMAKESPEC=win32-msvc2010
set PATH=C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Bin;%PATH%
set INCLUDE=C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include;%INCLUDE%
set LIB=C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include;%LIB%
#set CL=/D_USING_V140_SDK71_
configure.bat -prefix "d:\qt\qt5_6_3_msvc_x86" -confirm-license -opensource -debug-and-release -static -static-runtime -target xp -platform win32-msvc2010 -nomake examples -nomake tests -plugin-sql-sqlite -plugin-sql-odbc -qt-zlib -qt-libpng -qt-libjpeg -opengl desktop -mp -I D:\cpp_tools\OpenSSL-1.0.2u-Static-XP\OpenSSL\include -L D:\cpp_tools\OpenSSL-1.0.2u-Static-XP\OpenSSL\lib -openssl -openssl-linked OPENSSL_LIBS="-lssleay32 -llibeay32 -lgdi32" -icu -I C:\icu\dist\include -L C:\icu\dist\lib
jom /nmake
都编译完以后,在qt creator里面新建新项目,打开项目的pro工程文件,添加如下编译参数:
win32 {
QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWS,5.01
QMAKE_LFLAGS_CONSOLE = /SUBSYSTEM:CONSOLE,5.01
DEFINES += _ATL_XP_TARGETING
QMAKE_CFLAGS += /D_USING_V140_SDK71_
QMAKE_CXXFLAGS += /D_USING_V140_SDK71_
LIBS += -L$$quote(C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib)
INCLUDEPATH += $$quote(C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include)
}
本文介绍了如何在2021年的环境下编译QT 5.6.3以支持Windows XP系统。关键点包括:缩短QT源码目录名以解决qwebp.lib编译问题;推荐使用VS2010编译以避免运行时问题;设置编译参数如CL=/D_USING_V140_SDK71_以启用XP工具集;并提供了完整的编译批处理脚本内容。
751

被折叠的 条评论
为什么被折叠?



