前言
因项目需要,客户需要一个单独的exe程序,被迫自己静态编译一版qt
本次需求只是需要使用widget、qml、network(需要openssl)模块,其他模块只是顺带编译,所以本文档仅供有需要的小伙伴参考,若需要特定模块,请自行搭建相关编译环境
一、需求分析
Qt官方提供动态库开发环境,可以直接在线下载(Qt5.15开始,开源用户不再提供离线安装包),发布时,有一堆动态库
若直接使用静态编译,可以把所有库都放到一个exe程序中,不再依赖其他动态库或插件。但一般静态编译不包括编译器的运行时,在未安装msvc的电脑上,需要先安装微软VC++运行库合集(可通过360软件库直接下载)
所以本次考虑,直接将编译器的运行时,直接加入,到时只有一个exe程序即可运行
注:这样做,可能导致无法正常加载一般的第三方库,需要使用同一编译器编译带运行时的第三方库
二、环境准备
1.msys
网上安装教程比较多,就不再重复了,需要安装flex和bison
命令如下(时间所限,未验证)
pacman -S flex bison
2.vs2022
笔者使用的是社区版,这个就不重复了,记得选择C++开发环境
3.openssl
参考下笔者的文档
编译OpenSSL库(win10+msvc2022_x64)-CSDN博客
需要使用带运行时的openssl3.3静态库
4.python
笔者安装的是python3.10的版本(编译qml相关,需要)
5.ninja
笔者使用的是Qt在线安装包里的
6.cmake
笔者使用的是Qt在线安装包里的,版本号3.29.3
7.perl
笔者直接使用360软件管家下载的ActivePerl 64位(不清楚是否需要,先加上了)
8.Ruby
笔者直接使用360软件管家下载的Ruby(不清楚是否需要,先加上了)
三、Qt源码下载
https://download.qt.io/official_releases/qt/6.8/6.8.0/single/qt-everywhere-src-6.8.0.zip
四、Qt源码编译
1.将源码解压到一目录中,注意目录不要出现空格或中文,目录名也不要太长
笔者解压到了G:\Qt\6.8.0\Src\qt-everywhere-src-6.8.0
2.修改编译配置文件
打开{qt_source_dir}\qtbase\mkspecs\common\msvc-desktop.conf
笔者对应目录为G:\Qt\6.8.0\Src\qt-everywhere-src-6.8.0\qtbase\mkspecs\common\msvc-desktop.conf
使用文本编译器打开查找-MD,全部替换成-MT,笔者修改后如下
3.打开vs2022的控制台
切换到源码目录,笔者的目录如下
cd g:\Qt\6.8.0\Src\qtbase-everywhere-src-6.8.0
4.配置环境变量
执行以下指令
set PATH=D:\Qt\Tools\llvm-mingw1706_64\bin;D:\Qt\Tools\CMake_64\bin;D:\Qt\Tools\Ninja;D:\Ruby33-x64\bin;D:\Perl64\bin;%PATH%;D:\msys64\usr\bin;
set OPENSSL_ROOT_DIR={openssl_dir}\openssl-3.3.2\install_static
set OPENSSL_USE_STATIC_LIBS=ON
以上是笔者配置的环境变量,需要根据自己的实际情况配置下
笔者是直接在控制台窗口中进行的,也可以直接配置到系统的环境变量中
5.配置qt源码
建议使用影响编译,这样不会污染源码目录
笔者执行的命令如下:
cd ..
mkdir build
..\qt-everywhere-src-6.8.0\configure -static -static-runtime -prefix "D:\Qt\6.8.0\msvc2022_64_static" -debug-and-release -platform win32-msvc -nomake examples -nomake tests -qt-zlib -qt-libpng -qt-libjpeg -opengl dynamic -openssl-linked
部分配置选项解释:
-static
启用静态编译
-static-runtime
启用静态运行时
-prefix "D:\Qt\6.8.0\msvc2022_64_static"
预设安装目录
-confirm-license -opensource
是开源的
-debug-and-release
同时编译debug库和release库
-platform win32-msvc
使用msvc编译
-opengl dynamic 动态链接opengl库
-openssl-linked
直接链接openssl库编译(推荐)
若是需要进一步配置Qt源码,可以使用控制台打开cmake-gui.exe,直接打开编译目录
配置完成后,点击配置,
注:qt6.8.0不会出现配置结果列表(可能是个bug),需要到编译输出目录,找到config.summary文件,使用文本编译器打开看
笔者比较关心的是openssl是否已启用
确认无误后,直接点击生成
6.编译Qt源码
直接执行如下命令:
cmake --build . --parallel 6
#6代表开户6个线程同时编译
注:网上有说,开启多线程编译,有时会因编译的先后顺序不对,导致中止编译,只要重新执行下命令就可以继续编译
7.安装Qt
直接执行如下 命令
ninja install
笔者已经编译好的Qt6.8.0静态库(静态运行时),比较大,分成了两个包
参考资料:
Qt for Windows - Building from Source | Qt 6.9
后记
声明:因笔者本次编译时间过紧,并未进行全部验证