自己做網(wǎng)站 服務(wù)器臨沂做網(wǎng)站推廣的公司
文章目錄
- 開始之前
- 一、靜態(tài)庫(kù)(static Library)
- 定義
- 使用場(chǎng)景
- 特點(diǎn)
- 程序示例
- 二、動(dòng)態(tài)庫(kù)(dynamic Library)
- 定義
- 使用場(chǎng)景
- 特點(diǎn)。
- 程序示例
- 第二種調(diào)用
開始之前
測(cè)試環(huán)境:Qt 5.15.2 Based on Qt 6.4.3(MSVC 2019, x86_64)
操作系統(tǒng):Windows11 專業(yè)版
編程語(yǔ)言:C++
__編譯器:Qt Creator 11.0.3
本篇文章所有的代碼都是在上述的基礎(chǔ)上測(cè)試通過,此內(nèi)容應(yīng)當(dāng)是通用,不分版本,注明是為了后續(xù)定位缺陷,如有瑕疵,勞請(qǐng)指正。
一、靜態(tài)庫(kù)(static Library)
定義
靜態(tài)庫(kù)是在鏈接階段被合并到最終可執(zhí)行文件中的預(yù)編譯代碼集合。
它通常以.a(Unix/Linux)或.lib(Windows)為擴(kuò)展名。
使用場(chǎng)景
- 當(dāng)需要將某些特定代碼封裝起來但是又不想讓其被動(dòng)態(tài)加載
- 在嵌入式系統(tǒng)或者對(duì)啟動(dòng)時(shí)間和內(nèi)存占用有嚴(yán)格要求的環(huán)境中較為常見
特點(diǎn)
- 永久性: 一旦被鏈接到可執(zhí)行文件中,靜態(tài)庫(kù)的代碼就會(huì)成為該程序的一部分。
- 不可重用性:每個(gè)使用靜態(tài)庫(kù)的應(yīng)用程序都會(huì)包含一份完整的庫(kù)副本,這可能導(dǎo)致多個(gè)應(yīng)用程序之間存在重復(fù)代碼。
- 迭代更新:靜態(tài)庫(kù)需要重新編譯和鏈接所有依賴于該庫(kù)的應(yīng)用程序。
- 程序體積:導(dǎo)致生成的可執(zhí)行文件較大,因?yàn)樗怂幸蕾嚨膸?kù)代碼。
程序示例
- 創(chuàng)建靜態(tài)庫(kù)
staticLibraryDemo 是靜態(tài)庫(kù)的庫(kù)名字,創(chuàng)建路徑可根據(jù)個(gè)人修改,然后直接下一步。
直接下一步,默認(rèn)即可。(如需選擇cmake,可能生成的格式不太一樣,沒用過,這里僅以qmake為例)
類型:Shared Library
、Statically Linked Library
、Qt Plugin
三種類型,分別表示共享庫(kù)(動(dòng)態(tài)庫(kù))、靜態(tài)鏈接庫(kù)(靜態(tài)庫(kù))、Qt插件,我們這里創(chuàng)建靜態(tài)庫(kù),所以使用Statically Linked Library。
模塊:Core
、Gui
、Widgets
三個(gè)核心模塊,分別表示基礎(chǔ)模塊
(Qt的基礎(chǔ)模塊,它提供了Qt應(yīng)用程序所需的非GUI功能)、圖形模塊
(提供了用于創(chuàng)建圖形用戶界面的基本功能,包括基本的繪圖原語(yǔ)、窗口管理、鍵盤和鼠標(biāo)事件處理等)、組件模塊
(提供了用于創(chuàng)建傳統(tǒng)的桌面風(fēng)格的用戶界面組件),我們這里選擇Core即可。
這里選擇構(gòu)建組件,MSVC 2019 可在Visual Studio 2019調(diào)試,我項(xiàng)目配置的這個(gè)配件(根據(jù)自己配置選擇,可能2015甚至2020,或者沒有配置就直接MinGW也可),所以我選擇的就是Desktop Qt 5.15.2 MSVC2019 32 和 64位,然后下一步,直至創(chuàng)建成功,生成庫(kù)項(xiàng)目。
創(chuàng)建成功后,pro
文件里面,我們可以看見如上所述,1表示去掉GUI,2表示生成的是靜態(tài)庫(kù),然后我們就可以為自己的庫(kù)添加一些接口然后提供給外部使用了。
1: 默認(rèn)構(gòu)造函數(shù)不再贅述;
2: 靜態(tài)對(duì)象,提供給外部一個(gè)唯一的對(duì)象,不過必須將構(gòu)造函數(shù)(默認(rèn)、有參、拷貝)全部私有化,不然就失去了意義;
3:測(cè)試的接口,這里傳入兩個(gè)int然后返回相加的結(jié)果,TODO后面省略,自定義接口,實(shí)現(xiàn)很簡(jiǎn)單,考慮完整性,依舊貼上。
至此,Qt創(chuàng)建靜態(tài)庫(kù)已經(jīng)完成,生成之后沒問題即可。
-
打包發(fā)送
使用靜態(tài)庫(kù)只需要將上述截圖的兩個(gè)文件,一個(gè)Lib和一個(gè).h頭文件給到使用項(xiàng)目即可使用,這里需要注意一點(diǎn):
如果你生成靜態(tài)庫(kù)使用了32位的Release,那么你的項(xiàng)目也必須是32位的項(xiàng)目,否則會(huì)出現(xiàn)鏈接錯(cuò)誤,根據(jù)編譯器不同而不同錯(cuò)誤呈現(xiàn)方式。 -
測(cè)試靜態(tài)庫(kù)
新建一個(gè)測(cè)試項(xiàng)目(這里跳過),然后右鍵項(xiàng)目選擇添加庫(kù),出現(xiàn)如下圖所示:
選擇外部庫(kù),然后直接下一步。
新項(xiàng)目目錄如上所示,lib放在根目錄,然后新建了一個(gè)include文件夾保存庫(kù)頭文件。
1:選擇庫(kù)文件即軟件根目錄;
2:選擇包含目錄,即新建的include目錄;
3:我的測(cè)試環(huán)境是windows,所以這里我只選擇windows;
4:測(cè)試靜態(tài)庫(kù),選擇靜態(tài);
5:debug版本添加,我這里是Release版本,所以按需選擇即可,我這里主要是勾選解釋一下;
6:直接下一步,Qt會(huì)自動(dòng)在pro
文件里面添加對(duì)應(yīng)的庫(kù)格式,這里不截圖跳過。
庫(kù)使用即測(cè)試接口如上圖所示,到此靜態(tài)庫(kù)從創(chuàng)建到使用就結(jié)束了,大型項(xiàng)目同理。
二、動(dòng)態(tài)庫(kù)(dynamic Library)
定義
動(dòng)態(tài)庫(kù)是在運(yùn)行時(shí)被加載的預(yù)編譯代碼集合,在不同的操作系統(tǒng)中,動(dòng)態(tài)庫(kù)有不同的擴(kuò)展名:.so(Unix/Linux)、.dll(Windows)或.dylib(macOS)
使用場(chǎng)景
- 當(dāng)需要頻繁更新代碼或希望多個(gè)程序共享相同的功能時(shí)
- 在桌面應(yīng)用和服務(wù)器端應(yīng)用中非常普遍
特點(diǎn)。
- 可共享性:多個(gè)程序可以同時(shí)訪問同一份動(dòng)態(tài)庫(kù),節(jié)省內(nèi)存空間。
- 迭代更新:如果沒有改變接口,只需替換動(dòng)態(tài)庫(kù)文件即可更新其功能,而無需重新編譯和鏈接使用它的程序。
- 延遲綁定:函數(shù)調(diào)用等操作可以在程序運(yùn)行時(shí)進(jìn)行綁定,而不是在編譯時(shí)綁定。
- 程序體積:由于是外部加載的,所以不會(huì)增加可執(zhí)行文件本身的大小。
程序示例
程序相關(guān)與靜態(tài)庫(kù)相似,唯一不同的就是創(chuàng)建的幾個(gè)選擇,這里我不做講解,僅貼上創(chuàng)建截圖。
值得一提的是,這里的變化,靜態(tài)庫(kù)是staticlib
,動(dòng)態(tài)庫(kù)是lib
,pro
文件的區(qū)別。
動(dòng)態(tài)庫(kù)新增了一個(gè)global.h,到時(shí)候也要一起放進(jìn)項(xiàng)目的include(這里只針對(duì)我的測(cè)試,大家根據(jù)自己實(shí)際情況添加)
導(dǎo)入項(xiàng)目:
然后就可以使用了
這里再多介紹一種方式,上面是顯示加載,在pro里面有添加代碼不過是Qt自動(dòng)添加的,然后在根目錄也能找到lib和.h,然后在Release目錄能找到dll文件。
第二種調(diào)用
即通過QLibrary的方式隱式調(diào)用:
如上所述:
1、構(gòu)建QLibrary
對(duì)象的時(shí)候構(gòu)造函數(shù)指定dll路徑,然后通過對(duì)象的方法load()
去加載庫(kù),如果返回true表示加載成功,返回false表示加載失敗,也可通過unload()
函數(shù)去卸載庫(kù),返回值同load(),然后isLoaded()
函數(shù)查詢庫(kù)是否有調(diào)用成功,再程序運(yùn)行過程中。
可以看見,pro
文件里面通過添加庫(kù)的方式生成的代碼已經(jīng)屏蔽然后通過QLibrary
同樣打印了之前的內(nèi)容,說明是OK的。