免費(fèi)網(wǎng)站建設(shè)模版下載線下引流的八種推廣方式
????????庫是已經(jīng)寫好的、成熟的、可復(fù)用的代碼。在我們的開發(fā)的應(yīng)用中經(jīng)常有一些公共代碼是需要反復(fù)使用的,就把這些代碼編譯為庫文件。庫可以簡單看成一組目標(biāo)文件的集合,將這些目標(biāo)文件經(jīng)過壓縮打包之后形成的一個可執(zhí)行代碼的二進(jìn)制文件。庫有兩種:靜態(tài)庫(.a、.lib)和動態(tài)庫(.so、.dll)。所謂靜態(tài)、動態(tài)是指程序編譯成可執(zhí)行程序的鏈接階段。
?
靜態(tài)庫、動態(tài)庫區(qū)別是來自鏈接階段,鏈接成可執(zhí)行程序的時候如何處理庫。分別稱為靜態(tài)鏈接方式、動態(tài)鏈接方式。
????????靜態(tài)庫在鏈接階段,會將匯編生成的目標(biāo)文件.o與引用到的庫一起鏈接打包到可執(zhí)行文件中。因此對應(yīng)的鏈接方式稱為靜態(tài)鏈接。
????????動態(tài)庫在程序編譯時并不會被連接到目標(biāo)代碼中,而是在程序運(yùn)行是才被載入。不同的應(yīng)用程序如果調(diào)用相同的庫,那么在內(nèi)存里只需要有一份該共享庫的實(shí)例,規(guī)避了空間浪費(fèi)問題。動態(tài)庫在程序運(yùn)行時才被載入,也解決了靜態(tài)庫對程序的更新、部署和發(fā)布頁會帶來麻煩。用戶只需要更新動態(tài)庫即可,增量更新。把整個鏈接過程推遲到了運(yùn)行時再進(jìn)行,這就是動態(tài)鏈接的基本思想。
windows下靜態(tài)庫創(chuàng)建和使用
1.靜態(tài)庫的創(chuàng)建
1. 創(chuàng)建一個新項(xiàng)目,在已安裝的模板中選擇“常規(guī)”,在右邊的類型下選擇“空項(xiàng)目”,在名稱和解決方案名稱中輸入staticlib(只是一個庫的名稱)。點(diǎn)擊確定。
?
2.在解決方案資源管理器的頭文件中添加mylib.h文件(用來聲明庫文件中的函數(shù)),在源文件添加mylib.c文件(用來實(shí)現(xiàn)庫文件中的函數(shù))。這里那myadd函數(shù)做測試。
?
?
3. 配置項(xiàng)目屬性。因?yàn)檫@是一個靜態(tài)鏈接庫,所以應(yīng)在項(xiàng)目屬性的“配置屬性”下選擇“常規(guī)”,在其下的配置類型中選擇“靜態(tài)庫(.lib)。
?
?
?
?
4.編譯生成新的解決方案,在Debug文件夾下會得到mylib.lib (對象文件庫),將該.lib文件和相應(yīng)頭文件給用戶,用戶就可以使用該庫里的函數(shù)了。
?
?staticlib.lib是一個二進(jìn)制文件,如果想讓別人用,要把這個庫文件的頭文件也給別人,方便別人理解這個庫函數(shù)都有什么,可以實(shí)現(xiàn)什么功能。
?
2.靜態(tài)庫的使用
?創(chuàng)建一個新項(xiàng)目取名靜態(tài)庫測試
?
把要用的庫文件和庫文件的頭文件放到靜態(tài)庫測試項(xiàng)目文件夾下,然后加載到VS項(xiàng)目中
?
?
?
?
?
?
windows下靜態(tài)庫創(chuàng)建和使用
1.動態(tài)庫的創(chuàng)建
類似靜態(tài)庫,先創(chuàng)建一個項(xiàng)目,創(chuàng)建mydll.h和mydll.c,實(shí)現(xiàn)一個函數(shù),兩數(shù)想減,動態(tài)庫生成的動態(tài)庫文件有兩個mydll.lib和mydll.dll,此時的mydll.lib與靜態(tài)庫文件是不一樣的,動態(tài)庫中的lib只會放變量的聲明和導(dǎo)出函數(shù)的聲明。
?
?
?
然后把生成的mydll.lib和mydll.dll文件和mydll.h文件復(fù)制到測試項(xiàng)目文件夾里
2.動態(tài)庫的使用
總結(jié)
靜態(tài)庫
- 靜態(tài)庫對函數(shù)庫的鏈接是放在編譯時期完成的,靜態(tài)庫在程序的鏈接階段被復(fù)制到了程序中,和程序運(yùn)行的時候沒有關(guān)系;
- 程序在運(yùn)行時與函數(shù)庫再無瓜葛,移植方便。
- 浪費(fèi)空間和資源,因?yàn)樗邢嚓P(guān)的目標(biāo)文件與牽涉到的函數(shù)庫被鏈接合成一個可執(zhí)行文件。
- 空間浪費(fèi)是靜態(tài)庫的一個問題
- 另一個問題是靜態(tài)庫對程序的更新、部署和發(fā)布頁會帶來麻煩。如果靜態(tài)庫libxx.lib更新了,所有使用它的應(yīng)用程序都需要重新編譯、發(fā)布給用戶(對于玩家來說,只是一個很小的改動,卻導(dǎo)致整個程序重新下載,全量更新)。
動態(tài)庫
- 動態(tài)庫把對一些庫函數(shù)的鏈接載入推遲到程序運(yùn)行的時期。
- 可以實(shí)現(xiàn)進(jìn)程之間的資源共享。(因此動態(tài)庫也稱為共享庫)
- 將一些程序升級變得簡單。
- 甚至可以真正做到鏈接載入完全由程序員在程序代碼中控制(顯示調(diào)用)。
- 不同的應(yīng)用程序如果調(diào)用相同的庫,那么在內(nèi)存里只需要有一份該共享庫的實(shí)例。帶來好處的同時,也會有問題!如經(jīng)典的DLL Hell問題。
????????靜態(tài)庫在程序編譯時會被連接到目標(biāo)代碼中,程序運(yùn)行時將不再需要該靜態(tài)庫,因此體積較大。動態(tài)庫在程序編譯時并不會被連接到目標(biāo)代碼中,而是在程序運(yùn)行是才被載入,因此在程序運(yùn)行時還需要動態(tài)庫存在,因此代碼體積較小。