QT6.7.2源碼編譯 靜態(tài)庫 動態(tài)庫 (MSVC)
QT6.7.2源碼編譯 靜態(tài)庫 動態(tài)庫 (MSVC)
也可以參考官方的文檔 https://doc.qt.io/qt-6/build-sources.html
環(huán)境搭建
為了操作更有可復制性,這里在虛擬機中采用全新安裝的系統(tǒng)進行配置。
系統(tǒng)鏡像為:en-us_windows_10_enterprise_ltsc_2021_x64_dvd_d289cf96_2.iso
安裝 Visual Studio 2022
https://visualstudio.microsoft.com/downloads/
個人用就下個Professional版,公司用就自己掂量一下了。

下好后找到VisualStudioSetup.exe打開
打開后把Desktop development with C++勾上就行了
勾上后默認安裝MSVC編譯器,CMake支持等,反正就是配置正常的C++開發(fā)環(huán)境

安裝好后其實基本環(huán)境就有了
在開始菜單找到 Visual Studio 2022 / x64 Native Tools Command Prompt for VS 2022 點擊運行
這其實是一個bat腳本,用于初始化一些MSVC的編譯環(huán)境,點擊運行后會打開一個cmd窗口,在這個窗口打開的程序會繼承一些環(huán)境變量,這對于使用MSVC進行編譯很重要。比如在VSCode中使用MSVC編譯就需要在這個CMD窗口里啟動VSCode,才能獲得MSVC需要的編譯環(huán)境(實際上就是設置了一些環(huán)境變量)。當然這啟動的是64位的環(huán)境,如果需要編譯32位的,則運行
x86 Native Tools Command Prompt for VS 2022。

在CMD窗口依次輸入
> where ninja
> where cmake
> where python
可以查看環(huán)境中是否存在ninja和cmake,這兩個是編譯QT6所需要的。
cmake是meta構建工具,有點類似于C++里模板的概念,它本身不構建項目,而是生成構建后端的項目文件,這個后端也叫generator,比如后端是make,則cmake生成makefile,后端是vs,則生成sln項目,之后再使用make或vs去編譯。qt官方要求使用的構建后端是ninja,所以等下cmake會生成ninja的項目文件,通過ninja來調(diào)用msvc編譯器,從而編譯qt源碼。當然這個generator也是可以換了,不一定必須要ninja。
從圖中可以看到,缺少python環(huán)境。

去python官方下載安裝包 https://www.python.org/
有些地區(qū)由于網(wǎng)絡問題,會很慢

記得把Add python.exe to PATH勾上,然后安裝。
不勾的話,就會造成找不到python的情況

安裝好python后,把剛剛的CMD窗口關了,重新從開始菜單打開。
不重新打開的話,環(huán)境變量不會刷新,依舊找不到python,當然你要有辦法刷新環(huán)境變量也可以

重新檢查一下 cmake,ninja,python
> cmake --version
> ninja --version
> python --version
可以發(fā)現(xiàn)都顯示出了對應的版本號,再去qt官方對一下版本要求,如果都符合就可以了。
下載源碼
條件允許的話可以直接從官方下載,當然鏡像也可以
https://mirrors.nju.edu.cn/qt/
在 official_releases/qt/6.7/6.7.2/single/ 找到qt-everywhere-src-6.7.2.zip下載即可
single的話就是下載所有的源碼,當然也可以下載單獨的一個模塊,也就是從submodules文件夾下找,
但如果下載單獨的模塊就會有依賴問題,因為單獨的模塊可能依賴其它模塊,所以還要處理依賴,
我們常用的widget,core其實都是在qtbase模塊里,如果只是使用widget進行開發(fā),單獨編譯這個就夠了,
這個模塊沒有其它依賴,畢竟base嘛(,但一般我們還需要用到designer,designer是在qttools模塊里,
這個模塊有一些其它的依賴,單獨是沒辦法編譯的,所以為了省事,我們把全部源碼都下了,到時候可以選擇需要的模塊進行編譯。
存放源碼
下載源碼zip壓縮包后,需要找個地方存放,最好是找固定的位置放,以后編譯出來qt庫也放在一起。
這樣的目的是因為在編譯debug版的時會產(chǎn)生pdb文件,pdb文件中描述了源碼在什么位置,有了這個信息就可以源碼調(diào)試qt的庫,當然如果沒有這個需求,那編譯好后的文件就可以隨便挪動,源碼也可以刪了。如果是編譯不帶調(diào)試符號的release版的話,也是一樣,沒有固定位置的需要。
我這里就放在到E盤的Library目錄下,同時解壓源碼。
解壓可能很慢,推薦裝一個7zip來解壓
E:.
└───Library
├───src
│ │ qt-everywhere-src-6.7.2.zip
│ │
│ └───qt-everywhere-src-6.7.2
│ ├───cmake
│ ├───qtbase
│ ....
│
└───tmp
Library文件夾下有兩個目錄,src和tmp,src用于存放源碼,tmp充當編譯的臨時目錄,編譯完成后可以刪除。
src目錄里放了源碼的zip文件,和一個源碼解壓后的文件夾
硬盤可用空間最好有60G以上
編譯源碼
在源碼解壓后的目錄下有個configure.bat腳本,這個腳本會利用cmake生成ninja的項目文件,有了ninja的項目文件,我們就可以編譯了。
但這個腳本默認把項目文件生成在當前目錄下,如果直接在源碼目錄執(zhí)行,那么生成的ninja項目文件會和源碼混在一起,當然如果你編譯完后就把源碼刪了那也許可以這樣(沒試過),所以我們需要一個tmp目錄來存放生成的項目文件,編譯完成安裝庫后就可以把這個ninja項目的臨時文件刪了。
回到x64 Native Tools Command Prompt for VS 2022的CMD窗口,切換目錄到剛剛創(chuàng)建的tmp文件夾
> cd /d E:\Library\tmp

現(xiàn)在就可以執(zhí)行configure.bat腳本來生成ninja項目文件了,但configure.bat腳本并不在當前目錄下,那怎么辦呢?
可以使用../來表示上一級路徑,這樣就可以表示出configure.bat腳本的路徑了,
如果直接輸入
configure.bat腳本的全路徑應該也可以
下面就表示了configure.bat腳本的路徑
"../src/qt-everywhere-src-6.7.2/configure.bat"
為什么要用引號括起來?當然這里其實可以不用,但如果路徑中有空格就需要了
先不急著執(zhí)行這個腳本,先看看幫助信息
> "../src/qt-everywhere-src-6.7.2/configure.bat" --help
如果直接執(zhí)行configure.bat就是用默認的配置生成構建項目文件,但我們可以加一些參數(shù)來改變生成的構建項目的參數(shù),比如我們想要同時編譯debug和release版,或只想編譯某一個模塊,或只想編譯靜態(tài)庫,或只想用靜態(tài)運行時等。之所以叫configure.bat當然是因為能config?。?/p>
下面是我們需要用到的幾個參數(shù)
-static 編譯靜態(tài)庫
-static-runtime 使用靜態(tài)運行時(MD)
-debug-and-release 同時編譯release版和debug版
-release Release模式編譯
--prefix 編譯后庫的安裝位置
-submodules 選擇要編譯的模塊
編譯動態(tài)庫
下面我們通過組合參數(shù)來編譯動態(tài)庫,也就是把庫編譯成dll,主要用于在開發(fā)階段使用,因為動態(tài)庫鏈接速度快(只需要導入個函數(shù)就行了),所以為了開發(fā)階段快速編譯,一般都是采用動態(tài)庫(當然如果是閉源軟件,那為了不被qt發(fā)函,最好也用動態(tài)庫)
> "../src/qt-everywhere-src-6.7.2/configure.bat" -debug-and-release --prefix="../MSVC_2022/x64_Shared_MD" -submodules qtbase,qttools
-debug-and-release同時編譯debug和release版,如果不需要debug版,改成-release即可
--prefix="../MSVC_2022/x64_Shared_MD"表示等下編譯完成后安裝的目錄,也就是當前目錄的上一級目錄下的MSVC_2022/x64_Shared_MD文件夾,說是安裝其實就是把庫的頭文件,動態(tài)庫,cmake配置文件復制出來
-submodules qtbase,qttools這里表示要編譯兩個模塊,qbase一般都需要,qttools主要是因為designer在里面,如果你不需要designer就可以刪了這個,寫成這樣-submodules qtbase,當然如果你想編譯全部源碼,那直接把-submodules qtbase,qttools整個刪了就好了,默認是編譯全部的。
這里選擇編譯了qtbase和qttools模塊,正常widget開發(fā)夠用,如果要安裝別的模塊可以用逗號隔開,要安裝所有就把這個指令刪了(-submodules qtbase,qttools),qbase主要包括widgets,gui,core這些,qttools主要是為了編譯designer
當然你也可以加一些別的指令,比如skip跳過某些組件的編譯,具體可以看help
執(zhí)行命令后會開始配置
其實看命令行也知道,configure.bat的作用就是依據(jù)參數(shù),去設置cmake的編譯參數(shù),也可以自己手動配置cmake的編譯參數(shù)達到一樣的效果,但大可不必,畢竟它都幫你寫好了。

執(zhí)行完成后就可以看到tmp目錄下有一堆文件了

如果config成功,最后會提示你如何編譯、如何安裝
這里的編譯和安裝命令可能會依據(jù)配置情況,會有所不同,所以一定要看提示。
這里提示使用cmake --build . --parallel進行編譯,那么直接執(zhí)行這個指令就好了,接下來就是耐心等待了,注意硬盤可用空間。
> cmake --build . --parallel

編譯過程中有一些警告很正常,只要不是error就可以。
編譯完成后執(zhí)行 ninja install 來安裝庫
> ninja install
按照提示來執(zhí)行,也有可能不是這個命令

安裝好后查看Libaray文件夾下多出來了個MSVC_2022文件夾里面有個x64_Shared_MD文件夾

進入bin目錄,可以發(fā)現(xiàn)pdb符號和后綴為d的debug動態(tài)庫都有了

至此動態(tài)庫編譯完成
編譯靜態(tài)庫
步驟差不多,先把tmp目錄清空
記得清空tmp目錄

確認一下,CMD當前目錄是在tmp里,如果不是請cd到tmp目錄。

執(zhí)行以下指令
> "../src/qt-everywhere-src-6.7.2/configure.bat" -static -static-runtime -release --prefix="../MSVC_2022/x64_Static_Release_MT" -submodules qtbase,qttools
-static 表示編譯靜態(tài)庫
-static-runtime 表示使用靜態(tài)的VC運行時(就是把VC的運行時編譯進exe,這樣就不會出現(xiàn)在一些電腦上找不到運行時情況了)
-release Release模式編譯
如果加了-static-runtime,編譯我們自己項目的時候release要設置MT編譯參數(shù),否則可能會鏈接出錯。debug則要設置MTd編譯參數(shù),當然一般沒人debug都靜態(tài)編譯,因為靜態(tài)編譯比較慢。
也可以把-static-runtime刪了,這樣就不需要額外設置MD編譯參數(shù)了,但這樣只有qt的庫是靜態(tài)編譯的,當然編譯出來確實是一個exe單文件,但這個exe還是依賴vc的運行時dll的,如果電腦上沒有安裝vc的運行時,也是沒辦法運行的,所以為了一
靜到底,干脆也把vc的運行時靜態(tài)編譯進去exe了。
執(zhí)行指令后等待Config

仔細閱讀提示,發(fā)現(xiàn)編譯命令和之前一樣,但安裝命令變了
仔細看的話還有個警告,說QDoc不會編譯,和clang有關,需要配置clang,這個的話我們這邊不關心,有需要的話可以在官方進一步了解

直接執(zhí)行編譯命令即可
> cmake --build . --parallel

編譯好后執(zhí)行安裝
> cmake --install .

安裝后MSVC_2022下就多出來了一個文件夾x64_Static_Release_MT

至此靜態(tài)庫的編譯也完成了
用MSVC2022編譯的庫,不要給MinGW用,也不要給GCC之類的用,而且也不要去換MSVC的版本,如果要換編譯器或換版本,就全部都換掉,然后重新編譯。
記得把tmp目錄刪了,這東西很大,編譯好,安裝后一般就沒用了
src源碼目錄,看自己情況,如果你需要qt源碼調(diào)試,就留著,因為符號文件pdb里的路徑是指向這些源碼文件的,如果不需要就刪了。

浙公網(wǎng)安備 33010602011771號