庫(kù)有兩種:靜態(tài)庫(kù)(.a、.lib)和動(dòng)態(tài)庫(kù)(.so、.dll)。所謂靜態(tài)、動(dòng)態(tài)是指鏈接。靜態(tài)庫(kù)是將整個(gè)庫(kù)文件都拷貝到可執(zhí)行文件中了,而動(dòng)態(tài)庫(kù)只是將索引文件拷貝到可執(zhí)行文件中,可以通過(guò)索引文件找到動(dòng)態(tài)庫(kù)文件。
靜態(tài)庫(kù)實(shí)踐
使用方法
首先我們用vs創(chuàng)建一個(gè)靜態(tài)庫(kù),再創(chuàng)建之后我們發(fā)現(xiàn)會(huì)自動(dòng)生成4個(gè)文件(兩個(gè)頭文件,兩個(gè)源文件)
先來(lái)看pch.h文件
一進(jìn)去會(huì)給出一些注釋
其實(shí)意思就是在這個(gè)文件中加載頭文件和聲明函數(shù)的
然后framework.h中是定義宏的
pch.cpp里就是對(duì)pch.h中聲明的函數(shù)進(jìn)行定義
最后那個(gè)自己命名的文件就是測(cè)試文件
比如我們想創(chuàng)建一個(gè)加法函數(shù),那么首先我們?cè)趐ch.h中聲明這個(gè)函數(shù)
然后在pch.cpp中進(jìn)行實(shí)現(xiàn)
因?yàn)閹?kù)不能執(zhí)行,所以不能點(diǎn)擊本地調(diào)試器,我們可以點(diǎn)擊生成中的生成解決方案,這樣就不會(huì)報(bào)錯(cuò)了
點(diǎn)擊后我們就可以看到生成了一個(gè).lib文件,也會(huì)顯示出它的路徑
可以在這條路徑中找到靜態(tài)庫(kù)文件
那么我們要怎么使用這個(gè)靜態(tài)庫(kù)呢?
我們需要再打開(kāi)一個(gè)解決方案,創(chuàng)建一個(gè)空項(xiàng)目,然后添加一個(gè)源文件,我們想在這個(gè)源文件中使用剛才在靜態(tài)庫(kù)中添加的函數(shù)
在沒(méi)做任何操作的時(shí)候會(huì)出現(xiàn)一個(gè)未定義標(biāo)識(shí)符的錯(cuò)誤,因?yàn)椴徽J(rèn)識(shí)這個(gè)函數(shù)(當(dāng)前項(xiàng)目里沒(méi)有這個(gè)函數(shù)),解決辦法就是添加頭文件,那么頭文件在哪呢,在我們剛才那個(gè)項(xiàng)目的路徑中可以找到那個(gè)pch.h,然后在pch.h中還調(diào)用了framework.h
所以將這兩個(gè)個(gè)文件拷貝到當(dāng)前項(xiàng)目中,然后添加頭文件
此時(shí)我們可以看到不再報(bào)錯(cuò),但是如果要運(yùn)行還是不可以,會(huì)出現(xiàn)“無(wú)法解析的外部符號(hào)”的錯(cuò)誤,因?yàn)檫@個(gè)函數(shù)目前只有聲明,并沒(méi)有定義實(shí)現(xiàn),解決辦法是添加庫(kù)依賴(lài)
先將剛才生成的庫(kù)拷貝到當(dāng)前路徑下
這里為了使項(xiàng)目看起來(lái)更清晰整潔,我們可以創(chuàng)建兩個(gè)文件夾,一個(gè)用來(lái)放頭文件,一個(gè)用來(lái)放庫(kù)文件
那么這樣我們?cè)谔砑拥臅r(shí)候就需要稍微尋找一下路徑,這里涉及到絕對(duì)路徑和相對(duì)路徑:
- 相對(duì)路徑:./(當(dāng)前路徑下)或者是…/(當(dāng)前文件夾向上一層)
- 絕對(duì)路徑:從盤(pán)符開(kāi)始的路徑,比如:E:\20230105\靜態(tài)庫(kù)與動(dòng)態(tài)鏈接庫(kù)\network_1_01_applyLib
使用:只有當(dāng)前項(xiàng)目使用的文件,要隨著項(xiàng)目的移動(dòng)一起移動(dòng),放到同一個(gè)解決方案里,使用相對(duì)路徑;
操作系統(tǒng)提供的文件,使用絕對(duì)路徑。
添加庫(kù)依賴(lài):
最后再加上system(“pause”);,這樣就可以運(yùn)行了
總結(jié)
使用步驟:
- 把頭文件拷貝到當(dāng)前項(xiàng)目中,添加頭文件依賴(lài)
- 把庫(kù)文件拷貝到當(dāng)前項(xiàng)目中,添加庫(kù)文件依賴(lài)
動(dòng)態(tài)庫(kù)實(shí)踐
使用方法
先創(chuàng)建一個(gè)動(dòng)態(tài)鏈接庫(kù)文件,與靜態(tài)庫(kù)一樣,這里也有四個(gè)文件
我們?cè)谶@個(gè)文件中寫(xiě)兩個(gè)函數(shù)(為了比較),一個(gè)加法函數(shù),一個(gè)減法函數(shù)
我們?cè)诼暶鳒p法函數(shù)的前面寫(xiě)上_declspec(dllexport),因?yàn)橹挥新暶鲗?dǎo)出,才會(huì)在索引文件中生成索引
實(shí)現(xiàn)這兩個(gè)函數(shù)
然后我們旋轉(zhuǎn)生成解決方案,可以看到,生成了一個(gè).lib索引文件和一個(gè).dll
我們?nèi)?duì)應(yīng)路徑下找到他們,然后拷貝到靜態(tài)庫(kù)實(shí)踐中我們創(chuàng)建的那個(gè)測(cè)試項(xiàng)目中,當(dāng)然那兩個(gè)頭文件也需要拷貝過(guò)來(lái)
如果是靜態(tài)庫(kù),到此為止已經(jīng)可以正常執(zhí)行了,但我們?cè)谶\(yùn)行的時(shí)候發(fā)現(xiàn)會(huì)出現(xiàn)找不到dll文件的錯(cuò)誤,原因是我們需要將dll拷貝到exe同文件下
這樣就可以了
我們知道靜態(tài)庫(kù)有一個(gè)優(yōu)點(diǎn),就是在庫(kù)文件更新時(shí),只需要重新編譯庫(kù)并把庫(kù)提供給別人,別人不需要重新執(zhí)行可執(zhí)行文件就可以執(zhí)行exe
我們?cè)趧偛艅?dòng)態(tài)庫(kù)中的代碼修改一下,然后重新生成一下
再將用戶(hù)的exe同文件下的dll替換就可以,我們點(diǎn)擊exe可以發(fā)現(xiàn)執(zhí)行結(jié)果已經(jīng)做出改變
總結(jié)
使用步驟:
- 把頭文件拷貝到當(dāng)前項(xiàng)目中,添加頭文件依賴(lài)
- 把索引文件拷貝到當(dāng)前項(xiàng)目中,添加索引文件依賴(lài)
- 把dll拷貝到exe同文件下
靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的優(yōu)缺點(diǎn)
靜態(tài)庫(kù)
優(yōu)點(diǎn)
運(yùn)行速度比動(dòng)態(tài)庫(kù)快文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-700797.html
缺點(diǎn)
- 浪費(fèi)內(nèi)存空間,當(dāng)多個(gè)應(yīng)用程序依賴(lài)同一個(gè)靜態(tài)庫(kù),在內(nèi)存中要拷貝多份
- 更新部署發(fā)布比較麻煩,修改靜態(tài)庫(kù)代碼,不止要重新編譯庫(kù)文件,還需要重新編譯整個(gè)可執(zhí)行文件
動(dòng)態(tài)庫(kù)
缺點(diǎn)
運(yùn)行速度比靜態(tài)庫(kù)慢文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-700797.html
優(yōu)點(diǎn)
- 節(jié)省內(nèi)存空間,當(dāng)多個(gè)應(yīng)用程序依賴(lài)同一個(gè)動(dòng)態(tài)庫(kù),在內(nèi)存中只需要拷貝一份
- 更新部署發(fā)布簡(jiǎn)單,修改動(dòng)態(tài)庫(kù),只需要重新編譯庫(kù)文件即可,不需要重新編譯可執(zhí)行文件
- 動(dòng)態(tài)庫(kù)在運(yùn)行的時(shí)候才被載入,可以依靠程序控制庫(kù)文件的載入時(shí)間
到了這里,關(guān)于【計(jì)算機(jī)網(wǎng)絡(luò)】 靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!