当前栏目:c++技术
Windows下使用VS2019静态编译Qt6.2.3源码

2023-03-15
274
依赖项
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
@echo off
@REM 编译release版本
set "BUILD_TYPE=release"
@REM 文件夹名,用以区分不同的版本
set "DIR=msvc2019_x86_static_md"
@REM 安装目录,编译完成后QT库文件和相关工具链的安装位置
set "INSTALL_DIR=%DIR%_%BUILD_TYPE%"
@REM 解决方案文件夹,存放编译的中间文件
set "SLN_DIR=%INSTALL_DIR%_sln"
@REM 源码目录,根据实际情况填写
set "SRC_DIR=Src"
call "D:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars32.bat"
cmake -S %SRC_DIR% -B %SLN_DIR% -DBUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_PREFIX=%INSTALL_DIR% -DCMAKE_BUILD_TYPE=%BUILD_TYPE% ^
-DQT_BUILD_TESTS=FALSE -DQT_BUILD_EXAMPLES=FALSE -DCMAKE_MAKE_PROGRAM=C:\tools\ninja.exe -G "Ninja"
cmake --build %SLN_DIR% --config %BUILD_TYPE% --parallel
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
,如图:
1.修改源码里的qtbase\mkspecs\common\msvc-desktop.conf
文件
修改-MD为-MT
修改前:
QMAKE_CFLAGS_RELEASE = $$QMAKE_CFLAGS_OPTIMIZE -MD
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_OPTIMIZE -Zi -MD
QMAKE_CFLAGS_DEBUG = -Zi -MDd
修改后:
QMAKE_CFLAGS_RELEASE = $$QMAKE_CFLAGS_OPTIMIZE -MT
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_OPTIMIZE -Zi -MT
QMAKE_CFLAGS_DEBUG = -Zi -MTd
D的意思是动态编译(dynamic link),T的意思是静态编译(static link)。 这一步官方教程没有要求,但其他人的很多教程里都有写,我就加上了
MT版本编译脚本:qt_build_vs2019_x86_static_mt_release.bat
echo on
REM 编译release版本
set "BUILD_TYPE=release"
REM 文件夹名,用以区分不同的版本
set "DIR=d:\msvc2019_x64"
REM 安装目录,编译完成后QT库文件和相关工具链的安装位置
set "INSTALL_DIR=d:\msvc2019_x64"
REM 解决方案文件夹,存放编译的中间文件
set "SLN_DIR=%INSTALL_DIR%_sln"
REM 源码目录,根据实际情况填写
set "SRC_DIR=d:\qt-everywhere-src-6.4.2"
rem CALL "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" x64
cmake -S %SRC_DIR% -B %SLN_DIR% -DBUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_PREFIX=%INSTALL_DIR% -DCMAKE_BUILD_TYPE=%BUILD_TYPE% ^
-DQT_BUILD_TESTS=FALSE -DQT_BUILD_EXAMPLES=FALSE -DQT_FEATURE_static_runtime=ON -DCMAKE_MAKE_PROGRAM=ninja.exe -G "Ninja"
cmake --build %SLN_DIR% --config %BUILD_TYPE%
cmake --install %SLN_DIR% --config %BUILD_TYPE% --prefix=%INSTALL_DIR%
双击脚本,等待其执行完毕,QT库将会安装在:
msvc2019_x86_static_md_release
或 msvc2019_x86_static_mt_release
可能的问题与解答
如何切换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