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