動態鏈接庫與靜態鏈接庫的區別


靜態鏈接庫與動態鏈接庫都是共享代碼的方式,如果采用靜態鏈接庫,則無論你願不願意,lib 中的指令都全部被直接包含在最終生成的 EXE 文件中了。但是若使用 DLL,該 DLL 不必被包含在最終 EXE 文件中,EXE 文件執行時可以“動態”地引用和卸載這個與 EXE 獨立的 DLL 文件。靜態鏈接庫和動態鏈接庫的另外一個區別在於靜態鏈接庫中不能再包含其他的動態鏈接庫或者靜態庫,而在動態鏈接庫中還可以再包含其他的動態或靜態鏈接庫。靜態鏈接庫與靜態鏈接庫調用規則總體比較如下。

對於靜態鏈接庫(比較簡單):
首先,靜態鏈接庫的使用需要庫的開發者提供生成庫的.h頭文件和.lib文件。

生成庫的.h頭文件中的聲明格式如下:
extern "C" 函數返回類型 函數名(參數表);
在調用程序的.cpp源代碼文件中如下:
#include "..\lib.h"
#pragma comment(lib,"..\\debug\\libTest.lib")
//指定與靜態庫一起鏈接

第二,因為靜態鏈接庫是將全部指令都包含入調用程序生成的EXE文件中。因此如果用的是靜態鏈接庫,那么也就不存在“導出某個函數提供給用戶使用”的情況,要想用就得全要!要不就都別要!:)

對於動態鏈接庫:
動態鏈接庫的使用需要庫的開發者提供生成的.lib文件和.dll文件。或者只提供dll文件。
首先我們必須先注意到DLL內的函數分為兩種:
(1)DLL 導出函數,可供應用程序調用;
(2)DLL 內部函數,只能在 DLL 程序使用,應用程序無法調用它們。
因此調用程序若想調用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文件移除內存,這樣可以節省內存空間。
----------------------------------------------------------------------
----------------------------------------------------------------------
動態鏈接庫:在運行時加載
靜態鏈接庫:在編譯時直接聯到可執行文件中


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM