c语言库文件是dll还是lib,C语言之静态链接库与动态链接库(2)
我們發(fā)現(xiàn),無(wú)論是靜態(tài)鏈接庫(kù)還是動(dòng)態(tài)鏈接庫(kù),最后都有l(wèi)ib文件,那么兩者區(qū)別是什么呢?
其實(shí),兩個(gè)是完全不一樣的東西。靜態(tài)庫(kù)對(duì)應(yīng)的lib文件叫靜態(tài)庫(kù),動(dòng)態(tài)庫(kù)對(duì)應(yīng)的lib文件叫導(dǎo)入庫(kù)。實(shí)際上靜態(tài)庫(kù)本身就包含了實(shí)際執(zhí)行代碼、符號(hào)表等等,而對(duì)于導(dǎo)入庫(kù)而言,其實(shí)際的執(zhí)行代碼位于動(dòng)態(tài)庫(kù)中,導(dǎo)入庫(kù)只包含了地址符號(hào)表等,確保程序找到對(duì)應(yīng)函數(shù)的一些基本地址信息。
2.?對(duì)于靜態(tài)鏈接庫(kù),我們?cè)诰幾g和鏈接的時(shí)候已經(jīng)將所有的代碼都導(dǎo)入進(jìn)來(lái),因此,當(dāng)生成可執(zhí)行文件以后,可執(zhí)行文件包含所有的代碼。因此,在可執(zhí)行文件運(yùn)行時(shí)就不再需要靜態(tài)庫(kù)了,而對(duì)于動(dòng)態(tài)鏈接庫(kù),實(shí)際上,可執(zhí)行文件不包含DLL中的內(nèi)容,只是通過(guò)導(dǎo)入庫(kù)(.lib)知道了相應(yīng)的地址信息,因此,可執(zhí)行文件在運(yùn)行時(shí)動(dòng)態(tài)得去加載DLL.
五、小結(jié)
1. 靜態(tài)庫(kù)
* 靜態(tài)庫(kù)是把程序運(yùn)行時(shí)需要使用的函數(shù)編譯在一個(gè)二進(jìn)制文件中,擴(kuò)展名為.lib。當(dāng)程序link時(shí)把靜態(tài)庫(kù)中的二進(jìn)制數(shù)據(jù)和程序其它數(shù)據(jù)放到一起。程序運(yùn)行時(shí)不在需要lib和dll文件的支持。這樣做的壞處是開(kāi)發(fā)出來(lái)的程序占用磁盤(pán)空間較大。特別是windows系統(tǒng)中本來(lái)就有或很多程序運(yùn)行都需要的函數(shù)完全沒(méi)有必要每次開(kāi)發(fā)程序時(shí)都要使用各自的靜態(tài)庫(kù)。
* 靜態(tài)庫(kù)為.lib文件形式存在
* 鏈接后產(chǎn)生的可執(zhí)行文件包含了所有需要調(diào)用的函數(shù)的代碼,因此占用磁盤(pán)空間較大
* 如果有多個(gè)(調(diào)用相同庫(kù)函數(shù)的)進(jìn)程在內(nèi)存中間時(shí)運(yùn)行,內(nèi)存中就存有多份相同的庫(kù)函數(shù)代碼,因此占用內(nèi)存空間較多。
2. 動(dòng)態(tài)庫(kù)
* 動(dòng)態(tài)庫(kù)在開(kāi)發(fā)時(shí)僅是把dll中的函數(shù)名和參數(shù)放到應(yīng)用程序中,應(yīng)用程序運(yùn)行時(shí)根據(jù)函數(shù)名和參數(shù)調(diào)用dll中的函數(shù)來(lái)運(yùn)行,這樣操作系統(tǒng)中的應(yīng)用程序可以同時(shí)使用同一個(gè)dll。可以有效地節(jié)省硬盤(pán)空間,當(dāng)然這樣做使得程序設(shè)計(jì)更有層次。也有利于軟件工程師的分工和信息安全
* 動(dòng)態(tài)庫(kù)以.dl文件形式存在,且一般都有一個(gè)對(duì)應(yīng)的引入庫(kù)以.lib文件形式存在。純資源dll不生成.lib引入庫(kù)。
>引入庫(kù)和靜態(tài)庫(kù)的擴(kuò)展名均為*.lib,但是引入庫(kù)僅包含一些函數(shù)名和參數(shù)信息,沒(méi)有函數(shù)體,是為調(diào)用動(dòng)態(tài)庫(kù)服務(wù)的,它和動(dòng)態(tài)庫(kù)的關(guān)系相當(dāng)于.h文件和.cpp文件之間的關(guān)系;
* 動(dòng)態(tài)庫(kù)兩種綁定方式
>靜態(tài)綁定(static blnding) 使用靜態(tài)綁定的程序在一開(kāi)始載入內(nèi)存的時(shí)候,載入程序就會(huì)把程序所有調(diào)用到的動(dòng)態(tài)代碼的地址算出、確定下來(lái)。這種方式使程序剛運(yùn)行時(shí)的初始化時(shí)間較長(zhǎng),不過(guò)一但完成動(dòng)態(tài)裝載,程序的運(yùn)行速度就很快。
>動(dòng)態(tài)綁定(dynamic binding)?? 使用這種方式的程序并不在一開(kāi)始就完成動(dòng)態(tài)鏈接,而是直到真正調(diào)用動(dòng)態(tài)庫(kù)代碼時(shí),載入程序才計(jì)算(被調(diào)用的那部分)動(dòng)態(tài)代碼的邏輯地址,然后等到某個(gè)時(shí)候,程序又需要調(diào)用另外某塊動(dòng)態(tài)代碼時(shí),載入程序才又去計(jì)算這部分代碼的邏輯地址。所以,這種方式侄程序初始化時(shí)間較短,但運(yùn)行期間的性能比不上靜態(tài)綁定的程序。
*?使用動(dòng)態(tài)庫(kù)的兩種方法(windows)
>方法一: load-time dynamic linking
在要調(diào)用dll的應(yīng)用程序鏈接時(shí),將dll的輸入庫(kù)文件(import library,.lib文件)包含進(jìn)去。具體的做 法是在源文件開(kāi)頭加一句#include ,然后就可以在源文件中調(diào)用dlldemo.dll中的輸出文件了。
>方法二: run-time dynamic linking? 不必在鏈接時(shí)包含輸入庫(kù)文件,而是在源程序中使用LoadLibrary或LoadLibraryEx動(dòng)態(tài)的載入dll。
總結(jié)
以上是生活随笔為你收集整理的c语言库文件是dll还是lib,C语言之静态链接库与动态链接库(2)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 北京环球影城能不能带吃的
- 下一篇: 计算机c语言二级题型,计算机二级C语言题