lib與dill的區別

什麼是lib文件,libdll的關係如何 ?

(1)lib是編譯時需要的,dll是運行時需要的。 
如果要完成源代碼的編譯,有lib就夠了。 
如果也使動態連接的程序運行起來,有dll就夠了。 
在開發和調試階段,當然最好都有。 
(2)一般的動態庫程序有lib文件和dll文件。lib文件是必須在編譯期就連接到應用程序中的,而dll文件是運行期纔會被調用的。如果有dll文件,那麼對應的lib文件一般是一些索引信息,具體的實現在dll文件中。如果只有lib文件,那麼這個lib文件是靜態編譯出來的,索引和實現都在其中。靜態編譯的lib文件有好處:給用戶安裝時就不需要再掛動態庫了。但也有缺點,就是導致應用程序比較大,而且失去了動態庫的靈活性,在版本升級時,同時要發佈新的應用程序才行。 
(3)在動態庫的情況下,有兩個文件,一個是引入庫(.LIB)文件,一個是DLL文件,引入庫文件包含被DLL導出的函數的名稱和位置,DLL包含實際的函數和數據,應用程序使用LIB文件鏈接到所需要使用的DLL文件,庫中的函數和數據並不複製到可執行文件中,因此在應用程序的可執行文件中,存放的不是被調用的函數代碼,而是DLL中所要調用的函數的內存地址,這樣當一個或多個應用程序運行是再把程序代碼和被調用的函數代碼鏈接起來,從而節省了內存資源。從上面的說明可以看出,DLL.LIB文件必須隨應用程序一起發行,否則應用程序將會產生錯誤。 

 

.dll是在你的程序運行的時候才連接的文件,因此它是一種比較小的可執行文件格式,.dll還有其他的文件格式如.ocx等,所有的.dll文件都是可執行。 
.lib是在你的程序編譯連接的時候就連接的文件,因此你必須告知編譯器連接的lib文件在那裏。一般來說,與動態連接文件相對比,lib文件也被稱爲是靜態連接庫。當你把代碼編譯成這幾種格式的文件時,在以後他們就不可能再被更改。 
如果你想使用lib文件,就必須: 
包含一個對應的頭文件告知編譯器lib文件裏面的具體內容 
設置lib文件允許編譯器去查找已經編譯好的二進制代碼 
如 果你想從你的代碼分離一個dll文件出來代替靜態連接庫,仍然需要一個lib文件。這個lib文件將被連接到程序告訴操作系統在運行的時候你想用到什麼 dll文件,一般情況下,lib文件裏有相應的dll文件的名字和一個指明dll輸出函數入口的順序表。如果不想用lib文件或者是沒有lib文件,可以 用WIN32 API函數LoadLibraryGetProcAddress。事實上,我們可以在Visual C++ IDE中以二進制形式打開lib文件,大多情況下會看到ASCII碼格式的C++函數或一些重載操作的函數名字。 
一般我們最主要的關於lib文件的麻煩就是出現unresolved symble 這類錯誤,這就是lib文件連接錯誤或者沒有包含.c.cpp文件到工程裏,關鍵是如果在C++工程裏用了C語言寫的lib文件,就必需要這樣包含: 
extern "C" 

#include "myheader.h" 

這是因爲C語言寫的lib文件沒有C++所必須的名字破壞,C函數不能被重載,因此連接器會出錯。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章