1. 程式人生 > >C++中動態庫(.dll)和靜態庫(.lib)

C++中動態庫(.dll)和靜態庫(.lib)

最近,做一些程式的封裝,就瞭解了C++中封裝動態庫(.dll)和靜態庫(.lib)的方法,以及兩種庫呼叫時異同,現在記錄下,後續有新的理解,會繼續更新;

動態庫(.dll):動態庫又稱動態連結庫英文為DLL,是Dynamic Link Library 的縮寫形式,DLL是一個包含可由多個程式同時使用的程式碼和資料的庫,DLL不是可執行檔案。動態連結提供了一種方法,使程序可以呼叫不屬於其可執行程式碼的函式。函式的可執行程式碼位於一個 DLL 中,該 DLL 包含一個或多個已被編譯、連結並與使用它們的程序分開儲存的函式。DLL 還有助於共享資料和資源。多個應用程式可同時訪問記憶體中單個DLL 副本的內容。DLL 是一個包含可由多個程式同時使用的程式碼和資料的庫。Windows下動態庫為.dll字尾,在linux在為.so字尾。(引自百度百科)

靜態庫(.lib):靜態庫是指在我們的應用中,有一些公共程式碼是需要反覆使用,就把這些程式碼編譯為“庫”檔案;在連結步驟中,聯結器將從庫檔案取得所需的程式碼,複製到生成的可執行檔案中的這種庫。(引自百度百科)

區別:靜態庫和動態庫是兩種共享程式程式碼的方式,它們的區別是:靜態庫在程式的連結階段被複制到了程式中,和程式執行的時候沒有關係;動態庫在連結階段沒有被複制到程式中,而是程式在執行時由系統動態載入到記憶體中供程式呼叫。使用動態庫的優點是系統只需載入一次動態庫,不同的程式可以得到記憶體中相同的動態庫的副本,因此節省了很多記憶體。

編譯.dll檔案:

暫 空 :)

編譯.lib檔案:

暫 空 :)


下面主要談談這兩種庫的呼叫:

在我們程式碼編譯應用程式呼叫.dll庫時,需要在VS中配置環境:

1.附加包含目錄../include

2.附加庫目錄:../lib

3.附加依賴項:.lib

說明:編譯dll庫時,會生成.dll、.lib檔案(以及自帶的標頭檔案),其中呼叫函式的程式碼封裝在.dll檔案中——新增環境變數(或直接拷貝到庫目錄下,直接在庫目錄的路徑中包含),函式的呼叫地址及其他記憶體資訊封裝在.lib檔案中——附加依賴項中新增相應的名稱xxx.lib,函式的介面在標頭檔案中(.h)——包含目錄;

另:

1)在新增目錄的時候,應多考慮使用相對路徑(便於程式碼的移植);

2)如果我們需要將編譯的應用程式.exe檔案在其他的電腦上執行,需要打包它需要呼叫的.dll檔案(放在同一目錄下),呼叫的dll檔案包括:自己編譯的dll檔案和VC編譯器執行庫的dll檔案(MSVCP110D.dll,MSVCR110D.dll

),不用打包.lib檔案,因為在編譯應用程式的時候,已經將.lib檔案包含到生成的.exe檔案;

3)編譯.EXE 應用程式有兩種模式:Debug和Release,其中,D模式下表示除錯,生成的exe檔案中包含了除錯資訊的介面,R模式下是發行版exe程式,生成的exe檔案不包含除錯資訊,程式經過優化,效率高記憶體小;所以在移植到其他的電腦上使用時,優先考慮使用Release模式生成.exe檔案;

編譯應用程式呼叫.lib靜態庫:

如上面所講,靜態庫的.lib檔案包含了連結庫的所有資訊(函式程式碼和介面資訊)。所以我們在呼叫靜態庫.lib時,只需要包含標頭檔案目錄(../include. .h),附加庫目錄,即可;

這樣,生成的應用程式.exe中將包含靜態庫.lib的資訊,這將導致生成的exe程式過大,不利用移植;

未完待續。。。