VS2019编译Qt5.7.0(使用VC-LTL5、YY-Thunks)


前言

目标

  1. 使用较新的VS编译器。
  2. 支持XP系统。
  3. 不依赖VC运行时。
  4. 编译出的DLL尺寸尽可能小。

提示

  1. Qt最后一个支持Windows XP的版本是5.7.0。
  2. 最后一个支持XP的VC编译器版本是VC14。

解决方案

  1. 为了使用上最新的VC编译器,并且要求支持XP系统,就得使用第三方开源项目YY-Thunks。
  2. 为了不依赖VC运行时,且同时减少编译出的DLL文件大小,我选择使用了第三方开源项目VC-LTL5。

准备

Qt 5.7.0 源码
VC-LTL5
YY-Thunks

编译

VC-LTL5和YY-Thunks的使用说明查看官方文档,这里不再赘述。

0x01

将VC-LTL helper for nmake.cmd拷贝到Qt源码根目录下,编辑文件

::set WindowsTargetPlatformMinVersion=10.0.10240.0

修改为

set WindowsTargetPlatformMinVersion=5.1.2600.0

0x02

编辑qtbase\mkspecs\common\msvc-desktop.conf文件

  1. 静态编译参数(不依赖VC运行时)
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
  1. 子系统版本
    这一步是为了避免程序在XP系统上提示“...不是有效的Win32程序”。
QMAKE_LFLAGS_CONSOLE    = /SUBSYSTEM:CONSOLE
QMAKE_LFLAGS_WINDOWS    = /SUBSYSTEM:WINDOWS

改为

QMAKE_LFLAGS_CONSOLE    = /SUBSYSTEM:CONSOLE,5.01
QMAKE_LFLAGS_WINDOWS    = /SUBSYSTEM:WINDOWS,5.01
  1. 引入YY_Thunks_for_WinXP.obj
QMAKE_LFLAGS = /NOLOGO /DYNAMICBASE /NXCOMPAT

改为

QMAKE_LFLAGS = /NOLOGO /DYNAMICBASE /NXCOMPAT user32.lib ...\YY_Thunks_for_WinXP.obj

其中...\YY_Thunks_for_WinXP.obj是绝对路径。

0x03

运行VS2019命令行工具,CD到Qt源码根目录,运行VC-LTL helper for nmake.cmd,这样就配置好了VC-LTL5的相关参数

我仅编译qtbase和qtdoc模块,编译参数如下

configure -prefix "E:\Qt\vc16-shared" -confirm-license -opensource -target xp -release -opengl desktop -no-angle -no-directwrite -nomake examples -nomake tests -mp -skip qt3d -skip qtactiveqt -skip qtandroidextras -skip qtcanvas3d -skip qtcharts -skip qtconnectivity -skip qtdatavis3d -skip qtdeclarative -skip qtgamepad -skip qtgraphicaleffects -skip qtimageformats -skip qtlocation -skip qtmacextras -skip qtmultimedia -skip qtpurchasing -skip qtquickcontrols -skip qtquickcontrols2 -skip qtscript -skip qtscxml -skip qtsensors -skip qtserialbus -skip qtserialport -skip qtsvg -skip qtvirtualkeyboard -skip qtwayland -skip qtwebchannel -skip qtwebengine -skip qtwebsockets -skip qtwebview -skip qtwinextras -skip qtx11extras -skip qtxmlpatterns

(根据自身需要调整参数)

运行命令nmake开始编译。。。静待若干分钟后编译完成。
接着运行

nmake install
nmake docs
nmake install_docs

0x04

最后一步是可选项,在-prefix指定的目录下,还原msvc-desktop.conf文件中的相关参数。比如我将QMAKE_LFLAGS参数还原,这样就不会强制Qt工程引入YY-Thunks,将决定权交给具体的工程。
但debug版本必须也要引入YY-Thunks,pro文件可以这么写

win32 {
    CONFIG(debug, debug|release) {
        OBJECTS += .../YY_Thunks_for_WinXP.obj
    }
}

参考资料

QT