Lib,Dll區別及使用

2021-09-12 05:41:27 字數 2304 閱讀 1879

lib是乙個二進位制檔案,與dll類似,供其他程式呼叫。lib與dll的區別是:dll是執行時需要的,lib是編譯時需要的。

共有兩種庫:

一種是lib包含了函式所在的dll檔案和檔案中函式位置的資訊(入口),**由執行時載入在程序空間中的dll提供,稱為動態鏈結 庫dynamic link library。

一種是lib包含函式**本身,在編譯時直接將**加入程式當中,稱為靜態鏈結庫static link library。

共有兩種鏈結方式:

動態鏈結使用動態鏈結庫,允許可執行模組(.dll檔案或.exe檔案)僅包含在執行時定 位dll函式的可執行**所需的資訊。

靜態鏈結使用靜態鏈結庫,鏈結器從靜態鏈結庫lib獲取所有被引用函式,並將庫同**一起放到可執行檔案 中。

關於lib和dll的區別如下:

(1)lib是編譯時用到的,dll是執行時用到的。如果要完成源**的編譯,只需要 lib(動態鏈結庫是dll和lib,lib存放函式位置,靜態鏈結庫lib本身包含**);如果要使動態鏈結的程式執行起來,只需要dll(執行時只需要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裝載。(雖然有dll和lib但只想用dll)

不管是lib還是dll,都是需要新增對應的.**件。(有dll肯定是存放函式實現,lib可能是函式實現--靜態,也有可能是函式入口--動態)

使用lib需注意兩個檔案:

(1).h標頭檔案,包含 lib中說明輸出的類或符號原型或資料結構。應用程式呼叫lib時,需要將該檔案包含入應用程式的原始檔中。

(2).lib檔案,略。

使用dll需注意三個檔案:

(1).h標頭檔案,包含dll中說明輸出的類或符號原型或資料結構的.**件。應用程式呼叫dll時,需要將該檔案包含 入應用程式的原始檔中。

(2).lib檔案,是dll在編譯、鏈結成功之後生成的檔案,作用是當其他應用程式呼叫dll時,需要將該檔案引入應用 程式,否則產生錯誤。如果不想用lib檔案或者沒有lib檔案,可以用win32 api函式loadlibrary、getprocaddress裝載。

(3).dll檔案,真正的可執行檔案,開發成功後的應用 程式在發布時,只需要有.exe檔案和.dll檔案,並不需要.lib檔案和.h標頭檔案(編譯好的程式的函式入口和位置都沒變,只需要其實現的具體dll即可)

或者在系統環境變數中加入dll檔案的路徑(...\bin)或者在執行的exe專案設定屬性--除錯--環境中新增dll路徑

分兩種方法:

(1)適用於當前專案

1 第一步:專案->屬性->c/c++->常規->附加包含目錄(瀏覽.**件的路徑)   新增包含檔案

4 第三步:在要使用cpp檔案前加入 #include (注意檔案的路徑)

(這一步也可以在**中顯示呼叫 #pragma comment(lib, 「***.lib」) )
(若不新增,連線報錯:無法解析的外部符號)

上述方法,在每次建立工程時都要重新進行設定,而且debug和release都要進行設定,同時注意win32和win64平台

(2)適用於所有專案,設定好後即使重建新專案也不需重新設定。

這種方法已經不適用於vs2010和vs2013

1 tools->options->projects and solutions->vc++ directories ->show directories for:(選擇include files)->新增.h路徑

2 tools->options->projects and solutions->vc++ directories ->show directories for:(選擇library files)->新增lib路徑

(這些路徑只告訴編譯器怎麼找檔案,沒有說把那裡面的檔案加入工程.)

(若不設定,編譯報錯:無法開啟***檔案)。

面經筆記 lib dll區別

一種是lib包含了函式所在的dll檔案和檔案中函式位置的資訊 入口 由執行時載入在程序空間中的dll提供,稱為動態鏈結庫 一種是lib包含函式 本身,在編譯時直接將 加入程式當中,稱為靜態鏈結庫 共有兩種鏈結方式 動態鏈結使用動態鏈結庫,允許可執行模組 dll檔案或.exe檔案 僅包含在執行時定位d...

內建物件的區別及使用

1 區別 1.page指當前頁面有效。在乙個jsp頁面裡有效 2.request 指在一次請求的全過程中有效,即從http請求到伺服器處理結束,返回響應的整個過程,存放在httpservletrequest物件中。在這個過程中可以使用forward方式跳轉多個jsp。在這些頁面裡你都可以使用這個變數...

Swift中 !和 ?的區別及使用

相信大家在學習和使用swift的時候,肯定會被 和?搞瘋過,糾結這兩個符號到底是個什麼鬼 鬼知道什麼時候使用 什麼時候使用?下面就說一下 和?區別以及該怎麼使用!和 其實分別是swift語言中對一種可選型別 optional 操作的語法糖。那可選型別是幹什麼的呢?swift中是可以宣告乙個沒有初始值...