原文在這裡:
共有兩種庫:
一種是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。共有兩種...