VC生成dll時為何會同時生成一個lib文件啊

VC生成dll時為何會同時生成一個lib文件啊

靜態(tài)庫生成lib,動態(tài)庫也生成lib。動態(tài)庫生成的那個lib一般管它叫“導(dǎo)入庫”,這樣的lib在大多數(shù)情況下要比靜態(tài)庫的lib小,里面不包含涉及到的函數(shù)的具體代碼,里面只包含“這個函數(shù)在什么dll里面叫什么名字”這樣的信息。

你平時編程比如windows.h里的那些api,都是通過這種方式鏈接的。

比如彈出消息框的MessageBoxA,它在user32.lib中,但是user32.lib卻沒有包含MessageBoxA的具體代碼,它只寫明了這個函數(shù)在user32.dll中,名字叫做MessageBoxA。生成exe以后,windows在運行這個exe里的代碼之前,會先載入user32.dll,然后在里面查找MessageBoxA,隨后把MessageBoxA所在的地址寫入exe指定的位置(一般是導(dǎo)入表)。dll要調(diào)用這個函數(shù)的時候,就從導(dǎo)入表獲取函數(shù)地址,然后調(diào)用過去。

什么是lib文件,lib和dll的關(guān)系如何

如果要完成源代碼的編譯,有l(wèi)ib就夠了。如果也使動態(tài)連接的程序運行起來,有dll就夠了。

在開發(fā)和調(diào)試階段,當(dāng)然**都有。

(2)一般的動態(tài)庫程序有l(wèi)ib文件和dll文件。lib文件是必須在編譯期就連接到應(yīng)用程序中的,而dll文件是運行期才會被調(diào)用的。如果有dll文件免費干貨,那么對應(yīng)的lib文件一般是一些索引信息,具體的實現(xiàn)在dll文件中。如果只有l(wèi)ib文件,那么這個lib文件是靜態(tài)編譯出來的,索引和實現(xiàn)都在其中。

靜態(tài)編譯的lib文件有好處:給用戶安裝時就不需要再掛動態(tài)庫了。但也有缺點,就是導(dǎo)致應(yīng)用程序比較大,而且失去了動態(tài)庫的靈活性,在版本升級時,同時要發(fā)布新的應(yīng)用程序才行。(3)在動態(tài)庫的情況下,有兩個文件,一個是引入庫(.LIB)文件,一個是DLL文件,引入庫文件包含被DLL導(dǎo)出的函數(shù)的名稱和位置,DLL包含實際的函數(shù)和數(shù)據(jù),應(yīng)用程序使用LIB文件鏈接到所需要使用的DLL文件,庫中的函數(shù)和數(shù)據(jù)并不**到可執(zhí)行文件中,因此在應(yīng)用程序的可執(zhí)行文件中,存放的不是被調(diào)用的函數(shù)代碼,而是DLL中所要調(diào)用的函數(shù)的內(nèi)存地址,這樣當(dāng)一個或多個應(yīng)用程序運行是再把程序代碼和被調(diào)用的函數(shù)代碼鏈接起來,從而節(jié)省了內(nèi)存資源。

VC中dll的lib文件和dll有什么不同?

.lib是在你的程序編譯連接的時候就連接的文件,因此你必須告知編譯器連接的lib文件在那里。一般來說,與動態(tài)連接文件相對比,lib文件也被稱為是靜態(tài)連接庫。

當(dāng)你把代碼編譯成這幾種格式的文件時,在以后他們就不可能再被更改。

如果你想使用lib文件,就必須:1包含一個對應(yīng)的頭文件告知編譯器lib文件里面的具體內(nèi)容2設(shè)置lib文件允許編譯器去查找已經(jīng)編譯好的二進制代碼如果你想從你的好文分享代碼分離一個dll文件出來代替靜態(tài)連接庫,仍然需要一個lib文件。這個lib文件將被連接到程序告訴操作系統(tǒng)在運行的時候你想用到什么dll文件,一般情況下,lib文件里有相應(yīng)的dll文件的名字和一個指明dll輸出函數(shù)入口的順序表。如果不想用lib文件或者是沒有l(wèi)ib文件,可以用WIN32API函數(shù)LoadLibrary、GetProcAddress。事實上,我們可以在VisualC++IDE中以二進制形式打開lib文件,大多情況下會看到ASCII碼格式的C++函數(shù)或一些重載操作的函數(shù)名字百讀不厭