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