1. 程式人生 > >靜態庫lib和動態連結庫dll的基礎知識

靜態庫lib和動態連結庫dll的基礎知識

本文轉載自部落格中的一部分:原文連結

詳細內容如下:

5. 動態連結庫與靜態連結庫

一、靜態庫與動態庫 

      靜態連結庫就是程式在編譯的過程中將所有的物件檔案與相應庫檔案連結在一起生成可執行檔案,程式的執行不再需要其它檔案,檔案以.a的形式儲存;

      動態連結庫是把庫函式的連結的載入放到執行時,程式的執行必須要有所依賴的連結庫一起。以.so形式儲存;

windows下動態庫(DLL),靜態庫(LIB)

二、  靜態連結庫、動態連結庫各自的特點:

1.動態連結庫有利於程序間資源共享

           什麼概念呢?就是說,某個程式的在執行中要呼叫某個動態連結庫函式的時候,

作業系統首先會檢視所有正在執行的程式,看在記憶體裡是否已有此庫函式的拷貝了。如果有,則讓其共享那一個拷貝;只有沒有時才連結載入。這樣的模式雖然會帶來一些“動態連結”額外的開銷,卻大大的節省了系統的記憶體資源。

           C的標準庫就是動態連結庫,也就是說系統中所有執行的程式共享著同一個C標準庫的程式碼段。

          而靜態連結庫則不同,如果系統中多個程式都要呼叫某個靜態連結庫函式時,則每個程式都要將這個庫函式拷貝到自己的程式碼段,顯然將佔有更大的記憶體資源。

2. 將一些程序升級變得簡單。

           用靜態庫,如果庫發生變化,使用庫的程式要重新編譯。使用動態庫,只要動態庫提供給該程式的介面沒變,只要重新用新生成的動態庫替換原來就可以了。

3. 甚至可以真正做到連結載入完全由程式設計師在程式程式碼中控制。

           程式設計師在編寫程式的時候,可以明確的指明什麼時候或者什麼情況下,連結載入哪個動態連結庫函式。“有需求才調入”的原則。 

4.由於靜態庫在編譯的時候,就將庫函式裝載到程式中去了,而動態庫函式必須在執行的時候才裝載,所以程式執行的時候,用靜態庫更快些。

6.  C/C++編譯原理

C/C++編譯就是要將C/C++的程式碼對映到相應的機器碼,以及討論其中的記憶體管理模式,包括記憶體的分配,如何使用等等,整型、陣列、指標等這些在記憶體中的實現機制。

C/C++的編譯包括幾個部分,分別是編譯,彙編和連結。

    1. 編譯,就是將相應的高階語言程式碼對映到組合語言,處理define,include等命令,載入外部的程式碼;

    2. 彙編,就是將組合語言對映到機器碼;

    3. 連結,形成相應的動態和靜態連結庫。動態連線庫是在程式執行時動態的載入,靜態連線庫是直接拷貝進入程式,在程式執行時,這些靜態連線庫載入進來。

         靜態連結庫不同於動態連結庫(*.dll),在靜態庫情況下,函式和資料被編譯進一個二進位制檔案(通常副檔名為*.LIB),Visual C++的編譯器在連結過程中將從靜態庫中恢復這些函式和資料並把他們和應用程式中的其他模組組合在一起生成可執行檔案。這個過程稱為"靜態連結",此時因為應用程式所需的全部內容都是從庫中複製了出來,所以靜態庫本身並不需要與可執行檔案一起發行。

         備註:靜態庫在程式的發行時是不需要釋出庫的, 因為靜態連結就是將程式所需的所有程式直接拷貝到程式中來。

         在應用中,有一些公共程式碼是需要反覆使用,就把這些程式碼編譯為“庫”檔案;在連線步驟中,聯結器將從庫檔案取得所需的程式碼,複製到生成的可執行檔案中。這種庫稱為靜態庫,其特點是可執行檔案中包含了庫程式碼的一份完整拷貝;缺點就是被多次使用就會有多份冗餘拷貝。為了克服這個缺點可以採用動態連線庫。這個時候聯結器僅僅是在可執行檔案中打上標誌,說明需要使用哪些動態連線庫;當執行程式時,載入器根據這些標誌把所需的動態連線庫載入到記憶體

         備註:動態庫,肯定需要將程式與動態庫一起釋出,這樣就可以減少程式的大小。