使用 Visual Studio 建置 Qt 6

| | 0 Comments| 09:50
Categories:

由於 Heresy 這邊是用 Qt(官網)作為圖形介面程式開發的環境,所以在很久之前,Heresy 曾經記錄過自己建置 Qt 4.6.3 的經驗;不過後來,由於決定放棄自己建置、而是改用 Qt 官方提供的 Qt SDK,所以就沒研究怎麼自行建置了。

但是相對地,當引進 GitLab CI/CD 後,就變成得研究怎麼在 Windows Docker 裡面安裝 Qt SDK 了。

開始玩這部分後,才發現 Qt 在這部份真的很討厭…本來以為弄好第一次後,以後就沒什麼問題了,但是後來 Qt 一直修改他的安裝程式,導致常常過一段時間要重建 Docker image 的時候,安裝 Qt SDK 的腳本就廢掉、要修改(2020/02)…

而後來呢,Qt 更是直接把離線安裝程式拿掉,強制一定要使用線上安裝版,然後下載速度又慢到不行…

所以後來呢,Heresy 只好又開始研究怎麼自己建置 Qt 了。

這次使用的版本是 Visual Studio 2019、建置的 Qt 版本是 Qt 6.1.0,原始碼可以從官方網站下載(頁面、下載速度很慢)。


準備建置環境

根據官方的《Qt for Windows – Building from Source》,自行建置 Qt SDK,除了需要 Visual Studio 2019 外,還需要下列工具:

而由於 Heresy 是想要透過 Docker 來建置 Qt,所以這邊需要的工具,也都是寫成 Dockerfile 來玩了~

下面就是一個可以用來建置 Qt 6.1.0 的 Dockerfile:

# escape=`
# Use the latest Windows Server Core image with .NET Framework 4.8.
FROM mcr.microsoft.com/dotnet/framework/sdk:4.8-windowsservercore-20H2
# Restore the default Windows shell for correct batch processing.
SHELL ["cmd", "/S", "/C"]
# Download the Build Tools 2019 bootstrapper.
ADD https://aka.ms/vs/16/release/vs_buildtools.exe C:TEMPvs_buildtools.exe
ADD https://aka.ms/vs/16/release/channel C:TEMPVisualStudio.chman
# Install Build Tools excluding workloads and components with known issues.
RUN C:TEMPvs_buildtools.exe --quiet --wait --norestart --nocache `
     --channelUri C:TEMPVisualStudio.chman `
     --installChannelUri C:TEMPVisualStudio.chman `
     --installPath C:BuildTools `
     --add Microsoft.VisualStudio.Workload.VCTools `
     --add Microsoft.VisualStudio.Component.VC.Tools.x86.x64 `
     --add Microsoft.VisualStudio.Component.VC.ATLMFC `
     --add Microsoft.VisualStudio.Component.Windows10SDK.19041
# Install 7-Zip ADD https://www.7-zip.org/a/7z1900-x64.exe C:TEMP7z.exe RUN C:TEMP7z.exe /S /D=C:7Zip # Download CMake ADD https://github.com/Kitware/CMake/releases/download/v3.20.2/cmake-3.20.2-windows-x86_64.msi C:TEMPcmake.msi RUN C:TEMPcmake.msi /qn # Install Perl ADD https://strawberryperl.com/download/5.32.1.1/strawberry-perl-5.32.1.1-64bit.msi C:TEMPstrawberry-perl.msi RUN C:TEMPstrawberry-perl.msi /qn # Install Python ADD https://www.python.org/ftp/python/3.9.5/python-3.9.5-amd64.exe C:TEMPpython.exe RUN c:temppython.exe /quiet InstallAllUsers=1 PrependPath=1 # Download ninja ADD https://github.com/ninja-build/ninja/releases/download/v1.10.2/ninja-win.zip C:TEMPninja.zip RUN C:7Zip7z.exe x C:TEMPninja.zip -y -oc:ninja # clean download files RUN del C:TEMP* /q # add PATH RUN setx /M "path" "%path%;c:ninja;C:7Zip;C:Strawberryperlbin;C:Program FilesCMakebin" # Start developer command prompt with any other commands specified. ENTRYPOINT c:BuildToolsVCAuxiliaryBuildvcvars64.bat &&

之後只要執行:

docker build -t qtbuilder S:qtbuilder

就可以建立出一個名為「qtbuilder」的 Docker image,可以用來建置 Qt SDK 了。

當然,如果不想用 Docker 來建置,也可以把上述軟體都直接裝在電腦上來建置,不過記得要設置環境路徑、讓系統能找到上述的程式執行檔就是了。


建置流程

準備建置

接下來,就是要開始建置了~這邊首先是要把 Qt 的原始碼解壓縮。

這裡下載的檔案是「qt-everywhere-src-6.1.0.zip」,假設是把它解壓縮後放到「s:qt-everywhere-src-6.1.0」。

然後,就是建立 Docker 的容器、在裡面準備來建置了~

docker run -it --rm --isolation process --storage-opt size=64G
           -v S:qt-everywhere-src-6.1.0:c:code
           qtbuilder cmd

這邊就是 Qt 的原始碼對應到 Docker 內的 c:code 這個路徑來做存取;所以如果路徑不一樣的話,請自行修改紅字的部分。

另外要注意的,是由於建置 Qt 會需要大量的磁碟空間,所以這邊也有透過「–storage-opt size=64G」這個參數,調高 Docker 內部的磁碟空間(預設應該是 20GB)、否則建置到一半就會碰到磁碟空間不足的問題;如果不想用預設的內部空間玩的話,那就要自己額外去控制 volume mapping、並修改相對的路徑了。

在進入 Docker 後,則是先執行下面的指令:

mkdir c:build_debug c:build_release cd c:code_output cd c:build_debug c:codeconfigure -prefix c:code_output -debug cd c:build_release c:codeconfigure -prefix c:code_output -release

這邊會建立三個資料夾、build_debugbuild_release_output,前面兩個是用來放置建置過程的相關檔案的,一個是 debug 版、一個則是 release 版。

後者則是最後產生的 Qt SDK 檔案,這邊放在 c:code 裡面是為了把最後需要的檔案放在 「s:qt-everywhere-src-6.1.0」這個從外部對應進來的資料夾裡面;如果像另外兩個資料夾一樣直接放在 c: 下的話,一關閉 docker 容器就會全部消失了。

configure 的部分,則是透過 Qt 提供的腳本,來產生 CMake 建置所需要的檔案;這邊的「-prefix c:code_output」是指定建置後要把檔案放到哪裡;最後面的「-debug」或「-release」則是告訴它要建置 debug 或 release。

如果只想建置 debug、release 其中一個,那就只要選其中一個就好。

其他的參數,則可以參考官方的文件


開始建置

上面的 configure 完成後,就可以依序建置不同的版本了。

以 debug 板來說,就是執行:

cd c:build_debug
cmake --build .
cmake --install .

開始建置 Qt SDK 的 debug 了。

由於 Qt 本身算是相當肥大的函式庫,所以這邊的建置過程會很花時間,建議找一台好一點的閒置電腦來跑。

其中,cmake –build 是開始建置,建置完成後,建置好的檔案會散落在各地很難處理;所以接下來就是執行 cmake –install,要求他把必要的檔案、複製(安裝)到之前指定的輸出位置(_output)、方便後續使用。

而 Heresy 這邊是刻意把 debug 和 release 版的輸出路徑設成一樣,這樣在執行過後,就會把兩者的產出結果都放在一起了。

所以等 debug 版建置好後,只要再執行:

cd c:build_release
cmake --build .
cmake --install .

就可以建置 release 版了。

當兩者都完成後,就可以關掉 docker 了;此時,在「S:qt-everywhere-src-6.1.0_output」下就可以找到建置完的 Qt 6.1.0 SDK 了~

不過 Heresy 這邊建置出來的檔案、整個資料大小高達 2.6GB 左右…恩,很可怕呢~ XD


附註:

  • 下載的 Qt 6.1.0 裡面的 README 還是寫 Qt5… orz
    裡面寫的需求也不一樣。

  • Qt 提供的 configure 雖然可以指定「-debug-and-release」要求同時建置 debug 和 release 的版本;但是儘管在建置(cmake build)的過程的確同時建置了兩個版本,但是在要求他把檔案複製到輸出路徑的時候(cmake install),他卻只複製了 release 版…
    所以這邊還是採用個別建置的方法。

Leave a Reply

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *