1. 程式人生 > >(轉)靜態編譯,動態編譯,靜態連結庫,動態連結庫

(轉)靜態編譯,動態編譯,靜態連結庫,動態連結庫

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的執行就不在需要靜態連結庫了,可以獨立運行了。

一般的靜態編譯可以理解為載入靜態連結庫;動態編譯理解我載入動態連結庫。
靜態連結庫中不能包含其他庫,動態連結庫中能包含其他庫。