Windows下使用VS2019静态编译Qt6.2.3源码
依赖项
cmake
需要3.16版本以上
perl
下载后安装,保证命令行环境中可用
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
中的MD
、MDd
替换为MT
、MTd
,如图:
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_release
或 msvc2019_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脚本即可,包括切换 x86
和 x64
版本。
call "D:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars32.bat"
可以使用VS2017吗?
不可以。起码 Qt6.2.3
的源码不可以,经测试编译会失败。看上去是 Qt6.2.3
中使用了一些新的语法,VS2017不支持。
为什么CMake
的 generator
要用 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