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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM