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