靜態(tài)庫(kù)就是將需要的代碼直接鏈接進(jìn)可執(zhí)行程序;動(dòng)態(tài)庫(kù)就是在需要調(diào)用其中的函數(shù)時(shí),根據(jù)函數(shù)映射表找到該函數(shù)然后調(diào)入堆棧執(zhí)行。如果在當(dāng)前工程中有多處對(duì)dll文件中同一個(gè)函數(shù)的調(diào)用,那么執(zhí)行時(shí),這個(gè)函數(shù)只會(huì)留下一份拷貝。但是如果有多處對(duì)lib文件中同一個(gè)函數(shù)的調(diào)用,那么執(zhí)行時(shí),該函數(shù)將在當(dāng)前程序的執(zhí)行空間里留下多份拷貝,而且是一處調(diào)用就產(chǎn)生一份拷貝。
做成的lib文件本身比較大,但不必附帶dll;做成dll文件本身比較小,但需要附帶lib。
1.靜態(tài)連接庫(kù)
靜態(tài)鏈接庫(kù)與動(dòng)態(tài)鏈接庫(kù)都是共享代碼的方式,如果采用靜態(tài)鏈接庫(kù),則無(wú)論你愿不愿意,lib 中的指令都全部被直接包含在最終生成的 EXE 文件中了。但是若使用 DLL,該 DLL 不必被包含在最終 EXE 文件中,EXE 文件執(zhí)行時(shí)可以“動(dòng)態(tài)”地引用和卸載這個(gè)與 EXE 獨(dú)立的 DLL 文件。靜態(tài)鏈接庫(kù)和動(dòng)態(tài)鏈接庫(kù)的另外一個(gè)區(qū)別在于靜態(tài)鏈接庫(kù)中不能再包含其他的動(dòng)態(tài)鏈接庫(kù)或者靜態(tài)庫(kù),而在動(dòng)態(tài)鏈接庫(kù)中還可以再包含其他的動(dòng)態(tài)或靜態(tài)鏈接 庫(kù)。靜態(tài)鏈接庫(kù)與靜態(tài)鏈接庫(kù)調(diào)用規(guī)則總體比較如下。
對(duì)于靜態(tài)鏈接庫(kù)(比較簡(jiǎn)單):
首先,靜態(tài)鏈接庫(kù)的使用需要庫(kù)的開(kāi)發(fā)者提供生成庫(kù)的.h頭文件和.lib文件。
生成庫(kù)的.h頭文件中的聲明格式如下:
extern "C" 函數(shù)返回類型 函數(shù)名(參數(shù)表);
在調(diào)用程序的.cpp源代碼文件中如下:
#include "..\lib.h"
#pragma comment(lib,"..\\debug\\libTest.lib")
//指定與靜態(tài)庫(kù)一起鏈接
第二,因?yàn)殪o態(tài)鏈接庫(kù)是將全部指令都包含入調(diào)用程序生成的EXE文件中。因此如果用的是靜態(tài)鏈接庫(kù),那么也就不存在“導(dǎo)出某個(gè)函數(shù)提供給用戶使用”的情況,要想用就得全要!要不就都別要!:)
2.動(dòng)態(tài)鏈接庫(kù)
動(dòng)態(tài)鏈接庫(kù)的使用需要庫(kù)的開(kāi)發(fā)者提供生成的.lib文件和.dll文件?;蛘咧惶峁ヾll文件。
首先我們必須先注意到DLL內(nèi)的函數(shù)分為兩種:
(1)DLL 導(dǎo)出函數(shù),可供應(yīng)用程序調(diào)用;
(2)DLL 內(nèi)部函數(shù),只能在 DLL 程序使用,應(yīng)用程序無(wú)法調(diào)用它們。
因此調(diào)用程序若想調(diào)用DLL中的某個(gè)函數(shù)就要以某種形式或方式指明它到底想調(diào)用哪一個(gè)函數(shù)。
posted on 2009-07-21 13:08
老馬驛站 閱讀(1952)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
windows