MFC模块的动态链接库DLL以及静态链接库LIB编译后的调用
1.什么是靜態(tài)連接庫(kù),什么是動(dòng)態(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ù)。 (若是想在MFC應(yīng)用程序中調(diào)用動(dòng)態(tài)鏈接庫(kù)DLL,或靜態(tài)鏈接庫(kù)LIB,又或者是動(dòng)態(tài)鏈接庫(kù)DLL中要調(diào)用靜態(tài)鏈接庫(kù)LIB的接口,建議在編譯鏈接時(shí),所有模塊(exe,dll,lib)要么都是MFC作為共享的DLL,要么都MFC作為靜態(tài)鏈接庫(kù),或者都用標(biāo)準(zhǔn)的Windows庫(kù),總之可執(zhí)行程序和DLL或LIB中的調(diào)用應(yīng)保持一致。) ? ? 靜態(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ù)返回類(lèi)型 函數(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ù)提供給用戶(hù)使用”的情況,要想用就得全要!要不就都別要!:)
對(duì)于動(dòng)態(tài)鏈接庫(kù):
動(dòng)態(tài)鏈接庫(kù)的使用需要庫(kù)的開(kā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)用程序無(wú)法調(diào)用它們。
因此調(diào)用程序若想調(diào)用DLL中的某個(gè)函數(shù)就要以某種形式或方式指明它到底想調(diào)用哪一個(gè)函數(shù)
?
?
而對(duì)于一個(gè)工程模塊,我們可以將其編譯成動(dòng)態(tài)鏈接庫(kù)DLL的文件形式,也可以編譯成靜態(tài)鏈接庫(kù)LIB的文件。
若想條件編譯的話,可以定義一個(gè)標(biāo)識(shí)然后編譯的時(shí)候設(shè)置這個(gè)標(biāo)識(shí)一起編譯。
[cpp]?view plaincopy print?
若是有需要,想將原來(lái)以動(dòng)態(tài)鏈接庫(kù)DLL編譯的模塊,轉(zhuǎn)換成靜態(tài)鏈接庫(kù)LIB的形式,只需要將工程里編譯選項(xiàng)改成以靜態(tài)庫(kù)方式編譯就行。同時(shí)修改下DLL中的導(dǎo)出函數(shù)的聲明為普通函數(shù)聲明。
?
同時(shí)注意,應(yīng)用程序中調(diào)用靜態(tài)鏈接庫(kù).lib時(shí),只需要隱式的(即工程配置項(xiàng)里或用#pragma comment)引入.lib文件,因?yàn)殪o態(tài)鏈接庫(kù)的lib就是其本身,所以這樣我們就能直接調(diào)用靜態(tài)鏈接庫(kù)里的接口了。【他跟動(dòng)態(tài)鏈接庫(kù)DLL在開(kāi)發(fā)角度上,不同的是,DLL需要引入的是鏈接文件.lib,讓編譯器能找到DLL中的接口,其他在使用上都一樣】?
在這提醒下,
靜態(tài)鏈接庫(kù)文件.lib與動(dòng)態(tài)鏈接庫(kù)DLL編譯時(shí)產(chǎn)生的.lib鏈接文件是不一樣的,即便它們?cè)赪indows中呈現(xiàn)的文件格式是一樣的,動(dòng)態(tài)鏈接文件.lib里面僅僅只是保存了一些動(dòng)態(tài)鏈接導(dǎo)出函數(shù)的聲明,有心的朋友,可以比較下它們的大小,你會(huì)發(fā)現(xiàn),動(dòng)態(tài)鏈接文件.lib跟靜態(tài)鏈接庫(kù)文件.lib比起來(lái)小很多。
總結(jié)
以上是生活随笔為你收集整理的MFC模块的动态链接库DLL以及静态链接库LIB编译后的调用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 深度学习之Windows下安装caffe
- 下一篇: VS2010生成静态库(.lib)