当前位置: 首页 > backend >正文

Windows 11 Qt 5.15.x 源码编译,支持C++20

为了支持C++20,编译器选择 MSVC2022 和 mingw1310。

需要用到Qt6

Qt 5.15.x + Windows 11 + VS 2022 MSVC x64 源码编译

参考链接

Windows 10 Qt 5.15.x 源码编译_qt5.15.16编译-CSDN博客

系统win11

1.下载“vs2022_buildtools.exe”安装vs2022桌面开发套件。

一定要记得安装ATL;如果要安装其他版本编译器,可以同时安装对应版本的生成工具和ATL。

2.下载Qt源码,并解压

我的源码路径是:G:\\qt-everywhere-src-5.15.17

3.安装以下解释器并配置环境变量:

Python: https://www.python.org/downloads/

Perl64: https://www.perl.org/get.html

注意:选择安装python3.10,最新版python3.13.1可能编译不失败。

4.在开始菜单中找到 Visual Studio 2022 程序组,并运行 x64 Native Tools Command Prompt for VS 2022 命令行工具,切换到源码目录

5.执行以下安装配置命令

生成debug-and-release动态库;不编译文档和qtwebengine。

configure -debug-and-release -confirm-license -opensource -platform win32-msvc -prefix "G:\\Qt-Build-5.15.17" -qt-sqlite -qt-pcre -qt-zlib -qt-libpng -qt-libjpeg -qt-freetype -qt-harfbuzz -opengl dynamic -skip qtwebengine -nomake tests -no-compile-examples

6.构建并Install文件到构建目录:

set CL=/MP #开启多线程编译
nmake # -j8
nmake install

7.将源码和动态库都拷贝到Qt安装目录

​​

8.配置Qt套件

9.配置源代码路径

为了在调试模式可以跳转进qt源码,需要配置源码路径。由于编译qt源码是的路径是"G:\qt-everywhere-src-5.15.17" ,所以源路径就填该路径值。

Windows11+mingw13.2.0 编译 Qt 5.15.x源码

1.安装Qt5.15.2,Qt6.8.3

安装 Qt6.8.3是为了使用其 mingw编译环境。

2.下载Qt源码,并解压

我的源码路径是:G:\\qt-everywhere-src-5.15.17

3.打开Qt的mingw命令行工具,切换到源码目录

​4.修改源码

直接编译源码无法编译通过,需要改对源码进行修改,参考:

本版本库的一些备注 :: Fsu0413 的原版 Qt 构建 关于mingw部分

--- qtbase\qmake\Makefile.unix.win32	2024-11-20 21:56:33.000000000 +0800
+++ qtbase\qmake\Makefile.unix.win32	2025-07-24 22:47:07.000000000 +0800
@@ -1,8 +1,8 @@EXEEXT = .exe
-EXTRA_CXXFLAGS = -DUNICODE -DMINGW_HAS_SECURE_API=1
+EXTRA_CXXFLAGS = -DUNICODE -DMINGW_HAS_SECURE_API=1 -DWINVER=0x0601 -D_WIN32_WINNT=0x0601EXTRA_LFLAGS = -static -s -lole32 -luuid -ladvapi32 -lkernel32 -lnetapi32QTOBJS = \qfilesystemengine_win.o \qfilesystemiterator_win.o \qfsfileengine_win.o \qlocale_win.o \------------------------------------------------------------------------------------------------
--- qtbase\src\plugins\platforms\windows\windows.pri	2024-11-20 21:56:33.000000000 +0800
+++ qtbase\src\plugins\platforms\windows\windows.pri	2025-07-25 15:18:27.000000000 +0800
@@ -103,12 +103,13 @@SOURCES += $$PWD/qwindowsdrag.cpp}}qtConfig(tabletevent) {INCLUDEPATH += $$QT_SOURCE_TREE/src/3rdparty/wintab
+	 INCLUDEPATH += $$QT_SOURCE_TREE/src/3rdparty/angle/includeHEADERS += $$PWD/qwindowstabletsupport.hSOURCES += $$PWD/qwindowstabletsupport.cpp}qtConfig(sessionmanager) {SOURCES += $$PWD/qwindowssessionmanager.cpp
------------------------------------------------------------------------------------------------
--- qtdeclarative\features\hlsl_bytecode_header.prf	2024-11-20 21:56:37.000000000 +0800
+++ qtdeclarative\features\hlsl_bytecode_header.prf	2025-07-25 15:47:14.000000000 +0800
@@ -1,10 +1,16 @@
+# This variable is from a patch from Fsu0413. In order not to conflict with Qt defined one we use custom prefix
+#$$(DXSDK_DIR)/Utilities/bin/x64/fxc.exe
+mingw: FSU0413_QTDECLARATIVE_FEATURES_FXC = C:/Program Files (x86)/Windows Kits/10/bin/10.0.26100.0/x64/fxc.exe
+else: FSU0413_QTDECLARATIVE_FEATURES_FXC = fxc.exe
+
+for (SHADER, HLSL_SHADERS) {INPUT = $$eval($${SHADER}.input)fxc_$${SHADER}.input = $$INPUT
-    fxc_$${SHADER}.commands = fxc.exe /nologo /E $$eval($${SHADER}.entry) /T $$eval($${SHADER}.type) /Fh ${QMAKE_FILE_OUT} ${QMAKE_FILE_NAME}
+    fxc_$${SHADER}.commands = $$FSU0413_QTDECLARATIVE_FEATURES_FXC /nologo /E $$eval($${SHADER}.entry) /T $$eval($${SHADER}.type) /Fh ${QMAKE_FILE_OUT} ${QMAKE_FILE_NAME}fxc_$${SHADER}.output = $$eval($${SHADER}.header)fxc_$${SHADER}.dependency_type = TYPE_Cfxc_$${SHADER}.variable_out = HEADERSfxc_$${SHADER}.CONFIG += target_predepsQMAKE_EXTRA_COMPILERS += fxc_$${SHADER}}
------------------------------------------------------------------------------------------------
--- qtdeclarative\src\plugins\scenegraph\d3d12\qsgd3d12engine.cpp	2024-11-20 21:56:37.000000000 +0800
+++ qtdeclarative\src\plugins\scenegraph\d3d12\qsgd3d12engine.cpp	2025-07-27 18:38:30.000000000 +0800
@@ -60,12 +60,16 @@#include <windows.ui.xaml.h>#include <windows.ui.xaml.media.dxinterop.h>#endif#include <comdef.h>+#ifdef Q_CC_MINGW
+#include <d3d12sdklayers.h>
+#endif
+QT_BEGIN_NAMESPACE// NOTE: Avoid categorized logging. It is slow.#define DECLARE_DEBUG_VAR(variable) \static bool debug_ ## variable() \
@@ -218,13 +222,13 @@if (qEnvironmentVariableIsSet("QT_D3D_ADAPTER_INDEX")) {const int adapterIndex = qEnvironmentVariableIntValue("QT_D3D_ADAPTER_INDEX");if (SUCCEEDED(factory->EnumAdapters1(adapterIndex, &adapter))) {adapter->GetDesc1(&desc);const QString name = QString::fromUtf16((char16_t *) desc.Description);
-            HRESULT hr = D3D12CreateDevice(adapter.Get(), fl, _uuidof(ID3D12Device), nullptr);
+            HRESULT hr = D3D12CreateDevice(adapter.Get(), fl, __uuidof(ID3D12Device), nullptr);if (SUCCEEDED(hr)) {qCDebug(QSG_LOG_INFO_GENERAL, "Using requested adapter '%s'", qPrintable(name));*outAdapter = adapter.Detach();return;} else {qWarning("Failed to create device for requested adapter '%s': %s",
@@ -235,13 +239,13 @@for (int adapterIndex = 0; factory->EnumAdapters1(adapterIndex, &adapter) != DXGI_ERROR_NOT_FOUND; ++adapterIndex) {adapter->GetDesc1(&desc);if (desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE)continue;-        if (SUCCEEDED(D3D12CreateDevice(adapter.Get(), fl, _uuidof(ID3D12Device), nullptr))) {
+        if (SUCCEEDED(D3D12CreateDevice(adapter.Get(), fl, __uuidof(ID3D12Device), nullptr))) {const QString name = QString::fromUtf16((char16_t *) desc.Description);qCDebug(QSG_LOG_INFO_GENERAL, "Using adapter '%s'", qPrintable(name));break;}}@@ -714,13 +718,14 @@deviceManager()->unref();initialized = false;// 'window' must be kept, may just be a device loss}
-
+const int QSGD3D12EnginePrivate::MAX_SWAP_CHAIN_BUFFER_COUNT;
+const int QSGD3D12EnginePrivate::MAX_FRAME_IN_FLIGHT_COUNT;void QSGD3D12EnginePrivate::initialize(WId w, const QSize &size, float dpr, int surfaceFormatSamples, bool alpha){if (initialized)return;window = w;--------------------其他修改,跟编译报错无关----------------------------------------------------------------------------
diff -r qtbase\src\widgets\dialogs\qfiledialog_p.h qtbase\src\widgets\dialogs\qfiledialog_p.h
99c99
< struct QFileDialogArgs
---
> struct Q_WIDGETS_EXPORT QFileDialogArgs

注:“C:/Program Files (x86)/Windows Kits/10/bin/10.0.26100.0/x64/fxc.exe” 为 实际 fxc 程序路径

5.执行以下安装配置命令

生成debug-and-release动态库;不编译文档和qtwebengine。

configure -debug-and-release -confirm-license -opensource -platform win32-g++ -prefix "G:\\Qt-Build-5.15.17" -qt-sqlite -qt-pcre -qt-zlib -qt-libpng -qt-libjpeg -qt-freetype -qt-harfbuzz -opengl dynamic-skip qtwebengine -nomake tests -no-compile-examples -mp

注:“-opengl desktop” 改为了 “-opengl dynamic”。

6.构建并Install文件到构建目录

mingw32-make -j 16 # 多线程编译mingw32-make install -j 16

7.将源码和动态库都拷贝到Qt安装目录

问题

1.使用c++20

由于未知原因,在.pro文件添加 “CONFIG += c++20” 并不能启用 c++20 标准,可以在.pro文件添加如下:

contains(QMAKE_COMPILER, msvc){QMAKE_CXXFLAGS += /std:c++20
}else{QMAKE_CXXFLAGS += -std=c++20
}

2.msvc 编译报错

In included file: static assertion failed: error STL1000: Unexpected compiler version, expected Clang 19.0.0 or newer.

原因是Qt5.17 提供的 clangd版本较低。

可以不使用 clangd 或 使用 其他更高版本的 clangd (比如Qt6的)。

http://www.xdnf.cn/news/16418.html

相关文章:

  • MySQL进阶学习与初阶复习第四天
  • Canvas实现微信小程序图片裁剪组件全攻略
  • 在docker中安装frp实现内网穿透
  • Ubuntu简述及部署系统
  • 负载均衡 LoadBalance
  • web刷题
  • c++11--static_assert
  • Linux->自定义shell
  • FPGA IP升级
  • 网络服务综合项目
  • Oracle 数据库报 ora-00257 错误并且执行alter system switch logfile 命令卡死的解决过程
  • XSS利用
  • 02人工智能中优雅草商业实战项目视频字幕翻译以及声音转译之以三方AI模型API制作方式预算-卓伊凡|莉莉
  • linux 板卡实现vxi11服务
  • 阿里 Qwen3 四模型齐发,字节 Coze 全面开源,GPT-5 8 月初发布!| AI Weekly 7.21-7.27
  • 初识 docker [上]
  • 《 接口日志与异常处理统一设计:AOP与全局异常捕获》
  • P图太假?AI一键融入背景!
  • vLLM 的“投机取巧”:Speculative Decoding 如何加速大语言模型推理
  • 【优选算法】BFS解决FloodFill算法
  • 零基础学习性能测试第五章:JVM性能分析与调优-GC垃圾分代回收机制与优化
  • 死锁出现的原因
  • 《计算机组成原理与汇编语言程序设计》实验报告四 Debug及指令测试
  • #影·数学计划# N1 一元一次方程讲解 未完待续
  • 基于STM32的智能康养木屋监测系统
  • vector使用和模拟
  • 在本地环境中运行 ‘dom-distiller‘ GitHub 库的完整指南
  • openshift AI 2.22安装的需求
  • 人工智能与城市:城市生活的集成智能
  • 基于 LSTM 与 SVM 融合的时间序列预测模型:理论框架与协同机制—实践算法(1)