靜態鏈接庫與動態鏈接庫都是共享代碼的方式,如果采用靜態鏈接庫,則無論你願不願意,lib 中的指令都全部被直接包含在最終生成的 EXE 文件中了。但是若使用 DLL,該 DLL 不必被包含在最終 EXE 文件中,EXE 文件執行時可以“動態”地引用和卸載這個與 EXE 獨立的 DLL 文件。靜態鏈接庫和動態鏈接庫的另外一個區別在於靜態鏈接庫中不能再包含其他的動態鏈接庫或者靜態庫,而在動態鏈接庫中還可以再包含其他的動態或靜態鏈接庫。靜態鏈接庫與靜態鏈接庫調用規則總體比較如下。
對於靜態鏈接庫(比較簡單): 對於動態鏈接庫: 因此這里衍生出兩個問題: 第一,存在兩種調用方式——動態調用和靜態調用 第二,兩種調用方式的庫的生成過程和調用規則 1〉動態調用 生成庫的.h頭文件中的聲明格式如下: extern "C" 函數返回類型 __declspec(dllexport) 函數名(參數表); 在調用程序的.cpp源代碼文件中按如下流程調用: 在main函數代碼的開始處 定義需要的DLL模塊的句柄和此DLL模塊模塊中需要調用的函數的函數指針。 定義好后緊接着就是標准的三部曲: 取得需要的DLL模塊------>返回模塊句柄 LoadLibrary("DLL模塊路徑") 取得需要的函數地址———>返回函數指針GetProcAddress(模塊句柄,"函數名") 從內存中卸載DLL模塊———>FreeLibrary(模塊句柄) 2>靜態調用 在調用程序的.cpp源代碼文件中按如下流程調用: #include......... 告訴編譯器與 DLL 相對應的.lib 文件所在的路徑及文件名 #pragma comment(lib,"路徑和文件名") extern "C" 函數返回類型 _declspec(dllimport) 函數名(參數表)分號 int main() { .............. }
-------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------
靜態鏈接庫是.lib格式的文件,一般在工程的設置界面加入工程中,程序編譯時會把lib文件的代碼加入你的程序中因此會增加代碼大小,你的程序一運行lib代碼強制被裝入你程序的運行空間,不能手動移除lib代碼。動態鏈接庫是程序運行時動態裝入內存的模塊,格式*.dll,在程序運行時可以隨意加載和移除,節省內存空間。 在大型的軟件項目中一般要實現很多功能,如果把所有單獨的功能寫成一個個lib文件的話,程序運行的時候要占用很大的內存空間,導致運行緩慢;但是如果將功能寫成dll文件,就可以在用到該功能的時候調用功能對應的dll文件,不用這個功能時將dll文件移除內存,這樣可以節省內存空間。 ---------------------------------------------------------------------- ---------------------------------------------------------------------- 動態鏈接庫:在運行時加載 靜態鏈接庫:在編譯時直接聯到可執行文件中 |