静态链接库LIB和动态链接库DLL的区别 创建和示例
1.什么是靜態(tài)連接庫,什么是動態(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)鏈接庫,那么也就不存在“導(dǎo)出某個函數(shù)提供給用戶使用”的情況,要想用就得全要!要不就都別要!:)
對于動態(tài)鏈接庫:
動態(tài)鏈接庫的使用需要庫的開發(fā)者提供生成的.lib文件和.dll文件。或者只提供dll文件。
首先我們必須先注意到DLL內(nèi)的函數(shù)分為兩種:?
(1)DLL 導(dǎo)出函數(shù),可供應(yīng)用程序調(diào)用;?
(2)DLL 內(nèi)部函數(shù),只能在 DLL 程序使用,應(yīng)用程序無法調(diào)用它們。
因此調(diào)用程序若想調(diào)用DLL中的某個函數(shù)就要以某種形式或方式指明它到底想調(diào)用哪一個函數(shù)
靜態(tài)庫與導(dǎo)入庫的區(qū)別:
導(dǎo)入庫和靜態(tài)庫的區(qū)別很大,他們實質(zhì)是不一樣的東西。靜態(tài)庫本身就包含了實際執(zhí)行代碼、符號表等等,而對于導(dǎo)入庫而言,其實際的執(zhí)行代碼位于動態(tài)庫中,導(dǎo)入庫只包含了
地址符號表等,確保程序找到對應(yīng)函數(shù)的一些基本地址信息。
靜態(tài)鏈接與動態(tài)鏈接:
靜態(tài)鏈接方法:#pragma comment(lib, "test.lib") ,靜態(tài)鏈接的時候,載入代碼就會把程序會用到的動態(tài)代碼或動態(tài)代碼的地址確定下來
靜態(tài)庫的鏈接可以使用靜態(tài)鏈接,動態(tài)鏈接庫也可以使用這種方法鏈接導(dǎo)入庫
動態(tài)鏈接方法:LoadLibrary()/GetProcessAddress()和FreeLibrary(),使用這種方式的程序并不在一開始就完成動態(tài)鏈接,而是直到真正調(diào)用動態(tài)庫代碼時,載入程序才計算(被調(diào)用的那部分)動態(tài)代碼的邏輯地址,然后等到某個時候,程序又需要調(diào)用另外某塊動態(tài)代碼時,載入程序又去計算這部分代碼的邏輯地址,所以,這種方式使程序初始化時間較短,但運行期間的性能比不上靜態(tài)鏈接的程序。
總結(jié)
以上是生活随笔為你收集整理的静态链接库LIB和动态链接库DLL的区别 创建和示例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: css调用外部字体
- 下一篇: crf与bitrate对照表