LIB和 DLL的區別與使用

2021-06-20 14:05:39 字數 4208 閱讀 7532

原文在這裡:

共有兩種庫:

一種是lib

包含了函式所在的

dll檔案和檔案中函式位置的資訊(入口),**由執行時載入在程序空間中的

dll提供,稱為動態鏈結庫

dynamic link library

。一種是

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

static link library

。動態鏈結使用動態鏈結庫,允許可執行模組(

.dll

檔案或.exe

檔案)僅包含在執行時定位

dll函式的可執行**所需的資訊。

靜態鏈結使用靜態鏈結庫,鏈結器從靜態鏈結庫

lib獲取所有被引用函式,並將庫同**一起放到可執行檔案中。

關於lib

和dll

的區別如下:(1

)lib

是編譯時用到的,

dll是執行時用到的。如果要完成源**的編譯,只需要

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

裝載。使用

lib需注意兩個檔案:(1

).h標頭檔案,包含

lib中說明輸出的類或符號原型或資料結構。應用程式呼叫

lib時,需要將該檔案包含入應用程式的原始檔中。(2

).lib

檔案,略。

使用dll

需注意三個檔案:(1

).h標頭檔案,包含

dll中說明輸出的類或符號原型或資料結構的

.h檔案。應用程式呼叫

dll時,需要將該檔案包含入應用程式的原始檔中。(2

).lib

檔案,是

dll在編譯、鏈結成功之後生成的檔案,作用是當其他應用程式呼叫

dll時,需要將該檔案引入應用程式,否則產生錯誤。

如果不想用

lib檔案或者沒有

lib檔案,可以用

win32 api

函式loadlibrary

、getprocaddress

裝載。(3)

.dll

檔案,真正的可執行檔案,開發成功後的應用程式在發布時,只需要有

.exe

檔案和.dll

檔案,並不需要

.lib

檔案和.h

標頭檔案。

使用lib

的方法:

靜態lib

中,乙個

lib檔案實際上是任意個

obj檔案的集合,

obj檔案是

cpp檔案編譯生成的。在編譯這種靜態庫工程時,根本不會遇到鏈結錯誤;即使有錯,也只會在使用這個

lib的

ext檔案或者

dll工程裡暴露出來。在vc

中新建乙個

static library

型別的工程

lib,加入

test.cpp

檔案和test.h

檔案(標頭檔案內包括函式宣告),然後編譯,就生成了

lib.lib

檔案。別的工程要使用這個

lib有兩種方式:(1

)在project->link->object/library module

中加入lib.lib

檔案(先查詢工程目錄,再查詢系統

lib目錄);或者在源**中加入指令

#pragma comment(lib, 「lib.lib」)。(

2)將lib.lib

拷入工程所在目錄,或者執行檔案生成的目錄,或者系統

lib目錄中。(3

)加入相應的標頭檔案

test.h。使用

dll的方法:

使用動態鏈結中的

lib,不是

obj檔案的集合,即裡面不會有實際的實現,它只是提供動態鏈結到

dll所需要的資訊,這種

lib可以在編譯乙個

dll工程時由編譯器生成。

建立dll

工程的方法(略)。(1

)隱式鏈結

第一種方法是:通過

project->link->object/library module

中加入.lib

檔案(或者在源**中加入指令

#pragma comment(lib, 「lib.lib」)

),並將

.dll

檔案置入工程所在目錄,然後新增對應的

.h標頭檔案。

#include "stdafx.h"

#include "dllsample.h"

#pragma comment(lib, "dllsample.lib")    

//你也可以在專案屬性中設定庫的鏈結

intmain() (

2)顯式鏈結

需要函式指標和

win32 api

函式loadlibrary

、getprocaddress

裝載,使用這種載入方法,

不需要.lib

檔案和.h

標頭檔案,只需要

.dll

檔案即可

(將.dll

檔案置入工程目錄中)。

#include 

#include 

//使用函式和某些特殊變數

typedef 

void

(*dllfunc)(

int);

intmain()

dllfunc = (dllfunc)getprocaddress(hinstlibrary, "testdll");

if(dllfunc == null)

dllfunc(123);

std::cin.

get();

freelibrary(hinstlibrary);

return

(1);}

loadlibrary

函式利用乙個名稱作為引數,獲得

dll的例項(

hinstance

型別是例項的控制代碼),通常呼叫該函式後需要檢視一下函式返回是否成功,如果不成功則返回

null

(控制代碼無效),此時呼叫函式

freelibrary

釋放dll

獲得的記憶體。

getprocaddress

函式利用

dll的控制代碼和函式的名稱作為引數,返回相應的函式指標,同時必須使用強轉;判斷函式指標是否為

null

,如果是則呼叫函式

freelibrary 

釋放dll

獲得的記憶體。此後,可以使用函式指標來呼叫實際的函式。

最後要記得使用

freelibrary

函式釋放記憶體。

注意:應用程式如何找到

dll檔案?

使用loadlibrary

顯式鏈結,那麼在函式的引數中可以指定

dll檔案的完整路徑;如果不指定路徑,或者進行隱式鏈結,

windows

將遵循下面的搜尋順序來定位

dll:(1

)包含exe 

檔案的目錄(2

)工程目錄(3

)windows

系統目錄(4

)windows目錄(

5)列在

path

環境變數中的一系列目錄

LIB和DLL的區別與使用

共有兩種庫 一種是lib包含了函式所在的dll檔案和檔案中函式位置的資訊 入口 由執行時載入在程序空間中的dll提供,稱為動態鏈結庫dynamic link library。一種是lib包含函式 本身,在編譯時直接將 加入程式當中,稱為靜態鏈結庫static link library。共有兩種鏈結方...

LIB和DLL的區別與使用

共有兩種庫 一種是lib包含了函式所在的dll檔案和檔案中函式位置的資訊 入口 由執行時載入在程序空間中的dll提供,稱為動態鏈結庫dynamic link library。一種是lib包含函式 本身,在編譯時直接將 加入程式當中,稱為靜態鏈結庫static link library。共有兩種鏈結方...

LIB和DLL的區別與使用

原文 共有兩種庫 一種是lib包含了函式所在的dll檔案和檔案中函式位置的資訊 入口 由執行時載入在程序空間中的dll提供,稱為動態鏈結庫dynamic link library。一種是lib包含函式 本身,在編譯時直接將 加入程式當中,稱為靜態鏈結庫static link library。共有兩種...