1.定義
LIB檔案中包含函數代碼本身,在編譯時直接将代碼加入程式當中。稱為靜态連結庫static link library。
LIB包含了函數所在的DLL檔案和檔案中函數位置的資訊(入口),代碼由運作時加載在程序空間中的DLL提供,稱為動态連結庫dynamic link library。
靜态連結庫包括兩個檔案:
(1).h頭檔案,包含靜态連結庫中說明輸出的類或符号原型或資料結構。應用程式調用靜态連結庫時,需要将該檔案包含入應用程式的源檔案中。
(2).lib檔案,放到固定位置,在應用程式中添加庫目錄,在附加依賴項中進行添加。
動态連結庫包括三個檔案:
(1).h頭檔案,包含動态連結庫中說明輸出的類或符号原型或資料結構的.h檔案。應用程式調用動态連結庫時,需要将該檔案包含入應用程式的源檔案中。
(2).lib檔案,是動态連結庫在編譯、連結成功之後生成的檔案,作用是當其他應用程式調用.dll時,需要将該檔案引入應用程式,否則産生錯誤。如果不想用.lib檔案或者沒有.lib檔案,可以用WIN32 API函數LoadLibrary、GetProcAddress裝載。
(3).dll檔案,真正的可執行檔案,開發成功後的應用程式在釋出時,隻需要有.exe檔案和.dll檔案,并不需要.lib檔案和.h頭檔案。
2. .lib檔案和.dll檔案差別
(1).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裝載。
1.靜态編譯:編譯器在編譯可執行檔案時,把需要用到的對應動态連結庫(.so或.ilb)中的部分提取出來,連結到可執行檔案中去,
使可執行檔案在運作時不需要依賴于動态連結庫. 靜态lib将導出聲明和實作都放在lib中。編譯後所有代碼都嵌入到宿主程式。
2.動态編譯: 動态編譯的可執行檔案需要附帶一個的動态連結庫,在執行時,需要調用其對應動态連結庫中的指令。是以其優點一
方面是縮小了執行檔案本身的體積,另一方面是加快了編譯速度,節省了系統資源。缺點一是哪怕是很簡單的程式,隻用到了連結
庫中的一兩條指令,也需要附帶一個相對龐大的連結庫;二是如果其他計算機上沒有安裝對應的運作庫,則用動态編譯的可執行文
件就不能運作。
動态lib相當于一個h檔案,是對實作部分(.dll檔案)的導出部分的聲明。編譯後隻是将導出聲明部分編譯到宿主程式中,運作時
候需要相應的dll檔案支援。
動态連結庫:
建立一個動态連結庫,會生成x.dll,x.lib
動态連結庫有兩種加載方式:
1.一種是靜态加載,就是在編譯的時候就載入動态連結庫。此種方法可調用類方法.
可執行程式靜态加載動态連結庫需要三個檔案 x.dll, x.lib, x.h
可執行程式的頭檔案加入:
#include "x.h"
#pragma comment(lib,"x.lib")
編譯時還要附加庫目錄,防止程式編譯時無法找到x.dll。
2.動态加載
隻需要x.dll檔案。
在程式執行需要該動态連結庫的地方加載x.dll。
然後擷取需要的x.dll庫裡面的函數或資料.
該方法不能調用類方法.
可執行程式調用了動态連結庫,其運作不能缺少動态連結庫.
靜态連結庫:
建立一個靜态連結庫,會生成x.lib檔案
想要調用靜态連結庫裡面的内容需要x.lib檔案和x.h檔案
庫中内容會直接編譯到x.exe檔案中。
可執行程式使用靜态庫編譯成x.exe後,x.exe的運作就不在需要靜态連結庫了,可以獨立運作了。
一般的靜态編譯可以了解為加載靜态連結庫;動态編譯了解我加載動态連結庫。
靜态連結庫中不能包含其他庫,動态連結庫中能包含其他庫。