靜態鏈結與動態鏈結的區別

2021-06-16 12:30:39 字數 1960 閱讀 7768

動態鏈結庫、靜態庫、import庫區別

動態鏈結庫(dynamic linked library):

windows為應用程式提供了豐富的函式呼叫,這些函式呼叫都包含在動態鏈結庫中。其中有3個最重要的dll,kernel32.dll,它包含用於管理記憶體、程序和執行緒的各個函式;

user32.dll,它包含用於執行使用者介面任務(如視窗的建立和訊息的傳送)的各個函式;gdi32.dll,它包含用於畫圖和顯示文字的各個函式。

靜態庫(static library):

函式和資料被編譯進乙個二進位制檔案(通常擴充套件名為.lib)。在使用靜態庫的情況下,在編譯鏈結可執行檔案時,鏈結器從庫中複製這些函式和資料並把它們和應用程式的其它模組

組合起來建立最終的可執行檔案(.exe檔案)。

導入庫(import library):

在使用動態鏈結庫的時候,往往提供兩個檔案:乙個引入庫和乙個dll。引入庫包含被dll匯出的函式和變數的符號名,dll包含實際的函式和資料。在編譯鏈結可執行檔案時,只需

要鏈結引入庫,dll中的函式**和資料並不複製到可執行檔案中,在執行的時候,再去載入dll,訪問dll中匯出的函式。

在執行windows程式時,它通過乙個被稱作「動態鏈結」的程序與windows相接。乙個windows的.exe檔案擁有它使用不同動態鏈結庫的引用,所使用的函式即在那裡。當windows程

序被載入到記憶體中時,程式中的呼叫被指向dll函式的入口,如果dll不在記憶體中,系統就將其載入到記憶體中。

當鏈結windows程式以產生乙個可執行檔案時,你必須鏈結由程式設計環境提供的專門的「導入庫(import library)庫」。這些導入庫包含了動態鏈結庫名稱和所有windows函式呼叫的

引用資訊。鏈結程式使用該資訊在.exe檔案中構造乙個表,當引導程式時,windows使用它將呼叫轉換為windows函式。

靜態庫與導入庫的區別:

導入庫和靜態庫的區別很大,他們實質是不一樣的東西。靜態庫本身就包含了實際執行**、符號表等等,而對於導入庫而言,其實際的執行**位於動態庫中,導入庫只包含了

位址符號表等,確保程式找到對應函式的一些基本位址資訊。

靜態鏈結方法:#pragma comment(lib, "test.lib") ,靜態鏈結的時候,載入**就會把程式會用到的動態**或動態**的位址確定下來

靜態庫的鏈結可以使用靜態鏈結,動態鏈結庫也可以使用這種方法鏈結導入庫

動態鏈結方法:loadlibrary()/getprocessaddress()和freelibrary(),使用這種方式的程式並不在一開始就完成動態鏈結,而是直到真正呼叫動態庫**時,引導程式才計算(被呼叫的那部分)動態**的邏輯位址,然後等到某個時候,程式又需要呼叫另外某塊動態**時,引導程式又去計算這部分**的邏輯位址,所以,這種方式使程式初始化時間較短,但執行期間的效能比不上靜態鏈結的程式。

在軟體開發的過程中,大家經常會或多或少的使用別人編寫的或者系統提供的動態庫或靜態庫,但是究竟是使用靜態庫還是動態庫呢?他們的適用條件是什麼呢?

簡單的說,靜態庫和應用程式編譯在一起,在任何情況下都能執行,而動態庫是動態鏈結,顧名思義就是在應用程式啟動的時候才會鏈結,所以,當使用者的系統上沒有該動態庫時,應用程式就會執行失敗。再看它們的特點:

動態庫:

1.共享:多個應用程式可以使用同乙個動態庫,啟動多個應用程式的時候,只需要將動態庫載入到記憶體一次即可;

2.開發模組好:要求設計者對功能劃分的比較好。

靜態庫:**的裝載速度快,執行速度也比較快,因為編譯時它只會把你需要的那部分鏈結進去,應用程式相對比較大。但是如果多個應用程式使用的話,會被裝載多次,浪費記憶體。

總上,我個人認為,如果你的系統上有多個應用程式都使用該庫的話,就把它編譯成動態庫,這樣雖然剛啟動的時候載入比較慢,但是多工的時候會比較節省記憶體;如果你的系統上只有一到兩個應用使用該庫,並且使用的api比較少的話,就編譯成靜態庫吧,一般的靜態庫還可以進行裁剪編譯,這樣應用程式可能會比較大,但是啟動的速度會大大提高。

呵呵,個人的一些心得,不足之處,歡迎指出!

靜態鏈結與動態鏈結的區別

靜態鏈結是指要把呼叫的函式或者過程直接鏈結到可執行檔案中,成為可執行檔案的一部分。換句話說,函式和過程的 就在程式的exe 檔案中,該檔案包含了執行時所需的全部 靜態鏈結的缺點是當多個程式都呼叫相同函式時,記憶體中就會存在這個函式的多個拷貝,這樣就了浪費了記憶體資源。動態鏈結是相對於靜態鏈結而言的,...

靜態鏈結與動態鏈結的區別

windows為應用程式提供了豐富的函式呼叫,這些函式呼叫都包含在動態鏈結庫中。其中有3個最重要的dll,kernel32.dll,它包含用於管理記憶體 程序和執行緒的各個函式 user32.dll,它包含用於執行使用者介面任務 如視窗的建立和訊息的傳送 的各個函式 gdi32.dll,它包含用於畫...

靜態鏈結與動態鏈結的區別

動態鏈結庫 靜態庫 import庫區別 動態鏈結庫 dynamic linked library windows為應用程式提供了豐富的函式呼叫,這些函式呼叫都包含在動態鏈結庫中。其中有3個最重要的dll,kernel32.dll,它包含用於管理記憶體 程序和執行緒的各個函式 user32.dll,它...