Windows下使用VS2019静态编译Qt6.2.3源码

依赖项

cmake

https://cmake.org/download/

需要3.16版本以上

perl

https://strawberryperl.com

下载后安装,保证命令行环境中可用

ninja

https://github.com/ninja-build/ninja/releases

注意,请一定下载使用 win 版本。如果环境中已有 cygwin 版本的 ninja.exe ,请不要使用,否则会导致编译失败。具体使用的是哪个 ninja.exe ,在后面的脚本中会显式的指出。例如这里用的是 C:\tools\ninja.exe

编译脚本

将脚本放到与源码相同的目录,然后根据实际情况在脚本中指定源码路径。注意这里使用的都是相对路径,如需使用绝对路径,稍微对脚本做下修改即可。

MD 版本,开箱即用,无需其他处理

MD版本编译脚本:qt_build_vs2019_x86_static_md_release.bat

 1 @echo off
 2 @REM 编译release版本
 3 set "BUILD_TYPE=release"
 4 @REM 文件夹名,用以区分不同的版本
 5 set "DIR=msvc2019_x86_static_md"
 6 @REM 安装目录,编译完成后QT库文件和相关工具链的安装位置
 7 set "INSTALL_DIR=%DIR%_%BUILD_TYPE%"
 8 @REM 解决方案文件夹,存放编译的中间文件
 9 set "SLN_DIR=%INSTALL_DIR%_sln"
10 @REM 源码目录,根据实际情况填写
11 set "SRC_DIR=Src"
12 call "D:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars32.bat"
13 cmake -S %SRC_DIR% -B %SLN_DIR% -DBUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_PREFIX=%INSTALL_DIR% -DCMAKE_BUILD_TYPE=%BUILD_TYPE% ^
14     -DQT_BUILD_TESTS=FALSE -DQT_BUILD_EXAMPLES=FALSE -DCMAKE_MAKE_PROGRAM=C:\tools\ninja.exe -G "Ninja"
15 cmake --build %SLN_DIR% --config %BUILD_TYPE% --parallel
16 cmake --install %SLN_DIR% --config %BUILD_TYPE% --prefix=%INSTALL_DIR%

MT 版本,还需要对源码做一点修改,详情如下

编译前请修改文件:Src\qtbase\mkspecs\common\msvc-desktop.conf

将 QMAKE_CFLAGS_XXXXXXX 中的MDMDd 替换为MTMTd ,如图:

MT版本编译脚本:qt_build_vs2019_x86_static_mt_release.bat

 1 @echo off
 2 @REM 编译release版本
 3 set "BUILD_TYPE=release"
 4 @REM 文件夹名,用以区分不同的版本
 5 set "DIR=msvc2019_x86_static_mt"
 6 @REM 安装目录,编译完成后QT库文件和相关工具链的安装位置
 7 set "INSTALL_DIR=%DIR%_%BUILD_TYPE%"
 8 @REM 解决方案文件夹,存放编译的中间文件
 9 set "SLN_DIR=%INSTALL_DIR%_sln"
10 @REM 源码目录,根据实际情况填写
11 set "SRC_DIR=Src"
12 call "D:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars32.bat"
13 cmake -S %SRC_DIR% -B %SLN_DIR% -DBUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_PREFIX=%INSTALL_DIR% -DCMAKE_BUILD_TYPE=%BUILD_TYPE% ^
14     -DQT_BUILD_TESTS=FALSE -DQT_BUILD_EXAMPLES=FALSE -DQT_FEATURE_static_runtime=ON -DCMAKE_MAKE_PROGRAM=C:\tools\ninja.exe -G "Ninja"
15 cmake --build %SLN_DIR% --config %BUILD_TYPE%
16 cmake --install %SLN_DIR% --config %BUILD_TYPE% --prefix=%INSTALL_DIR%

双击脚本,等待其执行完毕,QT库将会安装在:

msvc2019_x86_static_md_releasemsvc2019_x86_static_mt_release

例如:

Demo测试

新建 CMakeLists.txt

1 cmake_minimum_required(VERSION 3.16.0)
2 project(QtStaticLinkTest)
3 string(APPEND CMAKE_PREFIX_PATH "D:/QT/6.2.3/6.2.3/msvc2019_x86_static_mt_release;")
4 find_package(Qt6 COMPONENTS Widgets REQUIRED)
5 add_compile_options(/MT)
6 add_executable(hello_qt main.cpp)
7 target_link_libraries(hello_qt Qt6::Widgets)

新建 main.cpp

1 #include <QApplication>
2 #include <QWidget>
3 int main(int argc, char *argv[])
4 {
5     QApplication app(argc, argv);
6     QWidget w;
7     w.show();
8     return app.exec();
9 }

命令行执行:

1 cmake -S . -B sln -G "Visual Studio 16 2019" -A Win32
2 cmake --build sln --config Release

最后生成独立的可执行文件:sln\Release\hello_qt.exe ,大小约 12M ,双击运行成功:

可能的问题与解答

如何切换VS环境?

脚本中有这么一句,作用就是调用VS自带的脚本设置环境,如果想使用不同的VS环境,那就调用不同的VS脚本即可,包括切换 x86x64 版本。

call "D:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars32.bat"

可以使用VS2017吗?

不可以。起码 Qt6.2.3 的源码不可以,经测试编译会失败。看上去是 Qt6.2.3 中使用了一些新的语法,VS2017不支持。

为什么CMakegenerator 要用 Ninja,而不直接使用 Visual Studio 16 2019 ?

Qt官方支持的 generator 只有 Ninja,如下图所示。

本地测试下来,如果强行使用 VS 的 generator ,也确实会导致 cmake 执行失败。

直接从官网下载 qt-everywhere-src-6.2.3.tar.xz 源码可以吗?

不可以,经过测试,官网下载的源码,在 Windows 上编译会有一些文件缺失,导致编译失败。本文使用的源码是Qt在线安装器安装的源码。如果你不想在线安装,那么我已经将上面用的源码放到了这里:链接:https://share.weiyun.com/qw9UA6Sh 密码:ujdd5x

posted @ 2022-03-22 00:41  你好阿汤哥  Views(2098)  Comments(1Edit  收藏  举报