1. 程式人生 > >LIB和DLL

LIB和DLL

轉這篇文章是因為以前有個誤區,以為lib為靜態庫,dll為動態庫,這理解並不錯,但不全面。lib分兩種的:
(1) lib包含所有內容的靜態庫,應用程式用它即可,這是我理解的一種
(2) lib只包含頭部資訊,為了配合dll使用,dll包含函式內容,這先前我不知道,以為dll本身包含了函式地址及內容。此時,可以觀察出lib比dll小很多:
curllib.dll         190KB
curllib.lib         14KB
curllib_static.lib  1857KB
本來是想上圖的,網速不給力。curllib.dll包含了函式內容,190KB,curllib.lib只是些函式入口,用於編譯,只有14KB,而curllib_static.lib包含了所有,1857KB,比dll還要大。
第二點與linux, unix系統很不同,在linux/unix上,.so已經包含了函式頭部資訊及內容,不需要一個.a的靜態庫作為編譯.

共有兩種庫:
一種是LIB包含了函式所在的DLL檔案和檔案中函式位置的資訊(入口),程式碼由執行時載入在程序空間中的DLL提供,稱為動態連結庫dynamic link library。
一種是LIB包含函式程式碼本身,在編譯時直接將程式碼加入程式當中,稱為靜態連結庫static link library。
共有兩種連結方式:
動態連結使用動態連結庫,允許可執行模組(.dll檔案或.exe檔案)僅包含在執行時定位DLL函式的可執行程式碼所需的資訊。
靜態連結使用靜態連結庫,連結器從靜態連結庫LIB獲取所有被引用函式,並將庫同程式碼一起放到可執行檔案中。

關於lib和dll的區別如下:
(1)lib是編譯時用到的,dll是執行時用到的。如果要完成原始碼的編譯,只需要lib;如果要使動態連結的程式執行起來,只需要dll。
(2) 如果有dll檔案,那麼lib一般是一些索引資訊,記錄了dll中函式的入口和位置,dll中是函式的具體內容;如果只有lib檔案,那麼這個lib檔案 是靜態編譯出來的,索引和實現都在其中。使用靜態編譯的lib檔案,在執行程式時不需要再掛動態庫,缺點是導致應用程式比較大,而且失去了動態庫的靈活 性,釋出新版本時要釋出新的應用程式才行。
(3)動態連結的情況下,有兩個檔案:一個是LIB檔案,一個是DLL檔案。LIB包含被DLL匯出的 函式名稱和位置,DLL包含實際的函式和資料,應用程式使用LIB檔案連結到DLL檔案。在應用程式的可執行檔案中,存放的不是被呼叫的函式程式碼,而是 DLL中相應函式程式碼的地址,從而節省了記憶體資源。DLL和LIB檔案必須隨應用程式一起發行,否則應用程式會產生錯誤。如果不想用lib檔案或者沒有 lib檔案,可以用WIN32 API函式LoadLibrary、GetProcAddress裝載。

使用lib需注意兩個檔案:
(1).h標頭檔案,包含lib中說明輸出的類或符號原型或資料結構。應用程式呼叫lib時,需要將該檔案包含入應用程式的原始檔中。
(2).LIB檔案,略。

使用dll需注意三個檔案:
(1).h標頭檔案,包含dll中說明輸出的類或符號原型或資料結構的.h檔案。應用程式呼叫dll時,需要將該檔案包含入應用程式的原始檔中。
(2).LIB檔案,是dll在編譯、連結成功之後生成的檔案,作用是當其他應用程式呼叫dll時,需要將該檔案引入應用程式,否則產生錯誤。如果不想用lib檔案或者沒有lib檔案,可以用WIN32 API函式LoadLibrary、GetProcAddress裝載。
(3).dll檔案,真正的可執行檔案,開發成功後的應用程式在釋出時,只需要有.exe檔案和.dll檔案,並不需要.lib檔案和.h標頭檔案。