依賴項
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