本文将介绍在 Windows 11 系统上使用 Visual Studio 2022 编译 Qt 5.15.17 源码的整个过程。

环境准备

在开始编译之前,请确保你已经安装并配置好以下软件和工具:

  • Visual Studio 2022编译器

安装时请确保勾选 “使用 C++ 的桌面开发” 工作负载

  • Qt源码

从 Qt 官方归档下载源码压缩包Qt5.15.17下载源码压缩包后并解压到一个不包含中文和空格的路径下

https://download.qt.io/archive/qt/5.15/5.15.17/single/qt-everywhere-opensource-src-5.15.17.zip

  • Clang工具

libclang用于编译Qt文档模块

https://download.qt.io/development_releases/prebuilt/libclang/libclang-release_60-windows-vs2015_64-clazy.7z

  • python2.7

QtWebEngine 模块需要 Python 2.7 版本,请从Python 官网下载并安装

https://www.python.org/downloads/release/python-2718

  • Perl

推荐使用 Strawberry Perl

https://strawberryperl.com

OpenSSL

从 OpenSSL 官网下载并编译安装 OpenSSL v1.1.1系列的版本,例如 Win64 OpenSSL v1.1.1w。具体可参考本博客中SSL编译教程

https://openssl-library.org/source

Node.js

推荐12及以后版本可以从Node.js官网下载

https://nodejs.org/zh-cn

配置环境变量

为了让编译脚本能够找到所需的工具,你需要将以下目录添加到系统的 PATH 环境变量中:

  • python、Perl、Node.js工具安装时注意勾选添加到环境变量

  • libclang工具下载解压后,将其bin目录加入到系统环境变量中

  • ANGLE 依赖于 GnuWin32 和 Win flex-bison 项目中的以下额外工具,这些工具位于qt源码中 gnuwin32/bin 文件夹中,我们需要将其加入到环境变量中:

注意:请根据你的实际安装路径进行调整。

编译Qt源码

SSL配置

如果您自行编译 Qt,可以通过设置 -openssl / -openssl-runtime 或 -openssl-linked 配置标志来配置 Qt 使用 OpenSSL 的方式。

如果在常规编译器包含目录和库目录中未找到 OpenSSL,可以设置 OPENSSL_PREFIX、OPENSSL_INCDIR 和 OPENSSL_LIBDIR 配置参数。如果设置了 OPENSSL_PREFIX,则 OPENSSL_INCDIR 默认为 OPENSSL_PREFIX/include,OPENSSL_LIBDIR 默认为 OPENSSL_PREFIX/lib。

可以通过设置 OPENSSL_LIBS、OPENSSL_LIBS_DEBUG 和 OPENSSL_LIBS_RELEASE 配置参数来调整实际要链接的库。

1.要在运行时加载 OpenSSL,请设置 -openssl-runtime 配置参数。 Qt 会尝试在编译器的默认包含路径中查找 openssl/ssl.h 和 openssl/opensslv.h。您可以通过设置 OPENSSL_INCDIR 来指定额外的包含目录。

这种方法在后期使用与编译自己开发的软件中,如果使用到网络模块,没有在软件中引入ssl相关动态链接库,软件依然可以正常启动。

configure -openssl-runtime OPENSSL_INCDIR="C:\Program Files\OpenSSL-Win64\include"

2.要将 Qt Network 与 OpenSSL 库链接,请设置 -openssl-linked 配置参数。使用 OPENSSL_PREFIX 变量可以让 Qt 正确定位并根据你的 OpenSSL 安装进行构建:

这种方法在后期使用与编译自己开发的软件中,如果使用到网络模块,没有在软件中引入ssl相关动态链接库,软件依然无法正常启动,必须将ssl相关链接库复制粘贴到项目的编译目录中。

configure -openssl-linked OPENSSL_PREFIX="C:\Program Files\OpenSSL-Win64"

3. 要将 Qt Network 链接到 OpenSSL 库的静态版本,请设置 -openssl-linked 参数,并设置 OPENSSL_PREFIX、OPENSSL_INCDIR 和 OPENSSL_LIBDIR。此外,您可能需要设置 OPENSSL_LIBS、OPENSSL_LIBS_DEBUG 和 OPENSSL_LIBS_RELEASE 配置参数,以便 Qt 能够正确链接到您构建的 OpenSSL 库的静态版本。

set OPENSSL_DIR=C:\Program Files\OpenSSL-Win64

configure -openssl-linked OPENSSL_INCDIR="%OPENSSL_DIR%\include" OPENSSL_LIBDIR="%OPENSSL_DIR%\lib\VC\static" OPENSSL_LIBS="-lWs2_32 -lGdi32 -lAdvapi32 -lCrypt32 -lUser32" OPENSSL_LIBS_DEBUG="-llibssl64MDd -llibcrypto64MDd" OPENSSL_LIBS_RELEASE="-llibssl64MD -llibcrypto64MD"

在确定好ssl的链接方式后可以正式开始编译qt源码,本文采用第一种方式进行编译。

1. 打开命令行工具

在Windows搜索中找到X64 Native Tools Command Prompt for VS2022

2. 切换到qt源码目录

3. 配置编译选项

使用 configure 命令配置编译选项。以下是一个推荐的配置示例:

.\configure.bat -prefix "D:\Qt\Qt5.15.17" -shared -confirm-license -opensource -debug-and-release -optimized-tools -sql-sqlite -qt-sqlite  -qt-zlib -qt-libpng -qt-libjpeg -qt-tiff -qt-webp -platform win32-msvc -openssl-runtime OPENSSL_INCDIR="E:\openssl\include" -mp -recheck-all

常用配置选项说明:

- -prefix "D:\Qt\Qt5.15.17":指定 Qt 的安装目录。

- -debug-and-release:同时编译 Debug 和 Release 版本的库。

- -opensource:使用开源版本的 Qt。

- -confirm-license:自动确认许可协议。

- -shared:编译为动态链接库(DLL)。如果需要静态库,请使用 -static。

- -platform win32-msvc:指定目标平台和编译器。

- -nomake examples:不编译示例。

- -nomake tests:不编译测试。

- -skip qtwebengine:跳过 QtWebEngine 模块的编译。

- -openssl-runtime "OPENSSL_INCDIR=D:\openssl\include" "OPENSSL_LIBDIR=D:\openssl\lib":指定 OpenSSL的头文件和库文件路径。

4. 执行编译源码

nmake

注意:编译过程会花费较长时间,请耐心等待。

5. 安装Qt

nmake install

6. 编译Qt文档

nmake docs

7. 安装Qt文档

nmake install_docs

参考链接

libclang编译qt文档模块版本问题 https://forum.qt.io/topic/146927/5-15-10-build-failed-with-qdoc

Qt官方编译教程-编译命令 https://doc.qt.io/archives/qt-5.15/windows-building.html

Qt官方编译教程-环境配置 https://doc.qt.io/archives/qt-5.15/windows-requirements.html

Qt官方编译教程-Web模块 https://doc.qt.io/archives/qt-5.15/qtwebengine-platform-notes.html#windows