如何在 Windows 10 上从源代码构建 Qt 6.2.2

How to build Qt 6.2.2 from source on Windows 10

我一直在尝试从源代码构建 Qt 6.2.2。我从在线安装程序下载了源包,但每次都失败,每次都出现不同的错误。我尝试了多种配置,例如:

configure.bat -static -release -platform win32-msvc -opensource -confirm-license -prefix "C:\Qt.2.2\Static" -make libs -make tools -nomake examples -nomake tests

configure.bat -static -release -platform win32-msvc -opensource -confirm-license -prefix "C:\Qt.2.2\Static" -make libs -make tools -nomake examples -nomake tests -no-icu -no-opengl -no-openssl -skip qtwayland -skip qtquick3d -skip qtquickcontrols2 -skip qtquicktimeline -skip qtshadertools -skip qtdeclarative -skip qtdoc -skip qttranslations -skip qt3d -skip qt5compat -skip qtcharts -skip qtcoap -skip qtdatavis3d -skip qtlottie -skip qtmqtt -skip qtopcua -skip qtscxml -skip qtvirtualkeyboard -skip qtmultimedia -skip qtwebengine -skip qtwebview

configure.bat -static -release -platform win32-msvc -opensource -confirm-license -prefix "C:\Qt.2.2\Static" -no-openssl -make libs -make tools -nomake examples -nomake tests

我尝试使用 x86_x64 VS 2017 的交叉工具命令提示符,x86_x64 VS 2019 的交叉工具命令提示符, 和 VS 2019 的 x64 本机工具命令提示符

这是我在使用所有配置选项时遇到的错误之一 cmake --build .

[1424/8836] Building CXX object 
qtbase\src\network\CMakeFiles\Network.dir\Network_autogen\mocs_compilation.cpp.obj
FAILED: 
qtbase/src/network/CMakeFiles/Network.dir/Network_autogen/mocs_compilation.cpp.obj
C:\PROGRA~2\MICROS~119\COMMUN~1\VC\Tools\MSVC24~1.283\bin\Hostx86\x64\cl.exe  
/nologo /TP -DQT_ASCII_CAST_WARNINGS -DQT_BUILDING_QT -DQT_BUILD_NETWORK_LIB - 
DQT_CORE_LIB -DQT_DEPRECATED_WARNINGS -DQT_DEPRECATED_WARNINGS_SINCE=0x060000 - 
DQT_DISABLE_DEPRECATED_BEFORE=0x040800 -DQT_MOC_COMPAT -DQT_NO_CAST_TO_ASCII - 
DQT_NO_DEBUG -DQT_NO_EXCEPTIONS -DQT_NO_FOREACH - 
DQT_NO_NARROWING_CONVERSIONS_IN_CONNECT -DQT_NO_USING_NAMESPACE - 
DQT_USE_QSTRINGBUILDER -DQT_USE_SYSTEM_PROXIES -DUNICODE -DWIN32 -DWIN64 - 
D_CRT_SECURE_NO_WARNINGS -D_ENABLE_EXTENDED_ALIGNED_STORAGE -D_UNICODE - 
D_USE_MATH_DEFINES -D_WIN64 - 
IC:\Qt.2.2\Src\qtbase\src\network\Network_autogen\include - 
IC:\Qt.2.2\Src\qtbase\include -IC:\Qt.2.2\Src\qtbase\include\QtNetwork - 
IC:\Qt.2.2\Src\qtbase\src\network -IC:\Qt.2.2\Src\qtbase\src\network\kernel - 
IC:\Qt.2.2\Src\qtbase\include\QtNetwork.2.2 - 
IC:\Qt.2.2\Src\qtbase\include\QtNetwork.2.2\QtNetwork - 
IC:\Qt.2.2\Src\qtbase\src\network\..rdparty\zlib\src - 
IC:\Qt.2.2\Src\qtbase\include\QtCore -IC:\Qt.2.2\Src\qtbase\mkspecs\win32-msvc - 
IC:\Qt.2.2\Src\qtbase\src\corelib -IC:\Qt.2.2\Src\qtbase\include\QtCore.2.2 - 
IC:\Qt.2.2\Src\qtbase\include\QtCore.2.2\QtCore -IC:\Strawberry\c\include /DWIN32 
/D_WINDOWS /DNDEBUG -O2 -MD /W3 /wd4530 /wd4577 -Zc:__cplusplus -permissive- -utf-8 - 
FS -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding  
-Zc:externConstexpr -Zc:wchar_t -guard:cf -std:c++17 
/YuC:/Qt/6.2.2/Src/qtbase/src/network/CMakeFiles/Network.dir/cmake_pch.hxx 
/FpC:/Qt/6.2.2/Src/qtbase/src/network/CMakeFiles/Network.dir/./cmake_pch.cxx.pch 
/FIC:/Qt/6.2.2/Src/qtbase/src/network/CMakeFiles/Network.dir/cmake_pch.hxx 
/showIncludes 
/Foqtbase\src\network\CMakeFiles\Network.dir\Network_autogen\mocs_compilation.cpp.obj 
/Fdqtbase\lib\Qt6Network.pdb /FS -c 
C:\Qt.2.2\Src\qtbase\src\network\Network_autogen\mocs_compilation.cpp
C:\Program Files (x86)\Microsoft Visual 
Studio19\Community\VC\Tools\MSVC.24.28314\include\memory(1764): error C2027: 
use of undefined type 'QSslCipherPrivate'
C:\Qt.2.2\Src\qtbase\include\QtNetwork\../../src/network/ssl/qsslcipher.h(56): 
note: see declaration of 'QSslCipherPrivate'
C:\Program Files (x86)\Microsoft Visual 
Studio19\Community\VC\Tools\MSVC.24.28314\include\memory(1763): note: while 
compiling class template member function 'void 
std::default_delete<QSslCipherPrivate>::operator ()(_Ty *) noexcept const'
    with
    [
        _Ty=QSslCipherPrivate
    ]
C:\Program Files (x86)\Microsoft Visual 
Studio19\Community\VC\Tools\MSVC.24.28314\include\memory(1873): note: see 
reference to function template instantiation 'void 
std::default_delete<QSslCipherPrivate>::operator ()(_Ty *) noexcept const' being 
compiled
    with
    [
        _Ty=QSslCipherPrivate
    ]
C:\Program Files (x86)\Microsoft Visual 
Studio19\Community\VC\Tools\MSVC.24.28314\include\memory(1802): note: see 
reference to class template instantiation 'std::default_delete<QSslCipherPrivate>' 
being compiled
C:\Qt.2.2\Src\qtbase\include\QtNetwork\../../src/network/ssl/qsslcipher.h(87): 
note: see reference to class template instantiation 
'std::unique_ptr<QSslCipherPrivate,std::default_delete<QSslCipherPrivate>>' being 
compiled
C:\Qt.2.2\Src\qtbase\include\QtCore\../../src/corelib/kernel/qmetatype.h(2168): 
note: see reference to class template instantiation 'std::array<char,38>' being 
compiled
C:\Qt.2.2\Src\qtbase\src\network\access\qnetworkaccesscache_p.h(127): note: see 
reference to function template instantiation 'std::array<char,38> 
QtPrivate::typenameHelper<QNetworkAccessCache::CacheableObject*>(void)' being 
compiled
C:\Qt.2.2\Src\qtbase\include\QtCore\../../src/corelib/kernel/qmetatype.h(2168): 
note: see reference to class template instantiation 'std::array<char,28>' being 
compiled
C:\Qt.2.2\Src\qtbase\include\QtNetwork\../../src/network/access/
qnetworkreply.h(197): 
note: see reference to function template instantiation 'std::array<char,28> 
QtPrivate::typenameHelper<QNetworkReply::NetworkError>(void)' being compiled
C:\Qt.2.2\Src\qtbase\include\QtCore\../../src/corelib/kernel/qmetatype.h(2168): 
note: 
see reference to class template instantiation 'std::array<char,31>' being compiled
C:\Qt.2.2\Src\qtbase\include\QtNetwork\../../src/network/ssl/
qsslpresharedkeyauthentica 
tor.h(94): note: see reference to function template instantiation 
'std::array<char,31> 
QtPrivate::typenameHelper<QSslPreSharedKeyAuthenticator*>(void)' being compiled
C:\Qt.2.2\Src\qtbase\include\QtCore\../../src/corelib/kernel/qmetatype.h(2376): 
note: 
see reference to class template instantiation 'std::array<char,30>' being compiled
C:\Qt.2.2\Src\qtbase\include\QtCore\../../src/corelib/kernel/qmetatype.h(1587): 
note: 
see reference to class template instantiation 'std::array<char,9>' being compiled
C:\Program Files (x86)\Microsoft Visual 
Studio19\Community\VC\Tools\MSVC.24.28314\include\memory(1764): error C2338: 
can't 
delete an incomplete type
C:\Program Files (x86)\Microsoft Visual 
Studio19\Community\VC\Tools\MSVC.24.28314\include\memory(1765): warning C4150: 
deletion of pointer to incomplete type 'QSslCipherPrivate'; no destructor called    
C:\Qt.2.2\Src\qtbase\include\QtNetwork\../../src/network/ssl/qsslcipher.h(56): 
note: 
see declaration of 'QSslCipherPrivate'
[1426/8836] Building CXX object 
qtbase\src\tools\qvkgen\CMakeFiles\qvkgen.dir\qvkgen.cpp.obj
ninja: build stopped: subcommand failed.

我还从 here 下载了 5.15.x 源代码,我可以使用我发布的第一个配置命令毫无问题地构建它。

我目前安装了 Strawberry Perl 5.32.x、python 3.10、3.9.x 和 Cmake 3.22.1,它们也在我的路径中。每 this 我符合要求。我使用 where which returns:

确认路径是正确的
where perl.exe
C:\Strawberry\perl\bin\perl.exe
where python.exe
C:\Users\MyNAme\AppData\Local\Programs\Python\Python39\python.exe
C:\Users\MyName\AppData\Local\Programs\Python\Python310\python.exe
where cmake.exe 
C:\Program Files\CMake\bin\cmake.exe
C:\Program Files (x86)\Microsoft Visual Studio19\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe

在撰写本文时,我一直在挖掘并发现了大量关于同一问题的错误报告。似乎一切都回到了 OpenSSL。我抓取了 OpenSSL 源代码,安装了 NASM 并将其添加到我的路径中。我配置并构建了 OpenSSL:

perl Configure VC-WIN64A
nmake all

一旦 OpenSSL 用它完成重新配置 Qt:

configure.bat -prefix "C:\Libraries\QT-Static" -release -platform win32-msvc -opensource -confirm-license -make libs -make tools -nomake examples -nomake tests -I "C:\Program Files\OpenSSL\include\openssl" -L "C:\Program Files\OpenSSL\lib"

这次显示如下:

Qt Network:
getifaddrs() ........................... no
IPv6 ifname ............................ no
libproxy ............................... no
Schannel ............................... yes
OpenSSL ................................ yes
Qt directly linked to OpenSSL ........ no
OpenSSL 1.1 ............................ yes
DTLS ................................... yes
OCSP-stapling .......................... yes
SCTP ................................... no
Use system proxies ..................... yes
GSSAPI ................................. no
Brotli Decompression Support ........... no

然后运行:

cmake --build . --parallel

它仍然失败,但这次有更多错误,再次链接回 OpenSSL 问题。我认为这可能与 CMAKE_CXX_STANDARD 标志有关,所以我强制使用 17 而不是允许 MSVC 强制使用最新但没有运气。有没有人设法让 6.2.2 在 windows 10 上构建,如果是的话如何?

将您的编译器升级到最新的 VS2019 版本 (16.11) - 另请参阅 https://bugreports.qt.io/browse/QTBUG-97999