VC环境下的静态库(lib)使用和动态库(Dll)的使用(清晰版)
VC環(huán)境下的靜態(tài)庫使用
一.??靜態(tài)庫包括.lib和.h文件,在工程中使用靜態(tài)庫分為3步:
<1>?在工程中加入靜態(tài)庫,有三種方法:
????? **方法一:項目設置中引用.lib,project->?? setting->?? link->?? object/library modules中添加.lib;(可以在這里指定路徑,也可以在project>settings>link>input的Additional library path中輸入.lib文件所在路徑,還可以在project->settting與Tools->Options->Directories指定路徑,具體區(qū)別見<2>)
????? **方法二:在項目中直接加入lib,project->?? add to project->?? files,選擇正確的.lib。
? ? ? **方法三:pragma comment(lib, "##/##/mine.lib")?,路徑名,系統(tǒng)會優(yōu)先查找環(huán)境path
?
?
?
<2>?在工程中包括.h文件;
在應用程序工程中使用
#include "file path"
*file path可以為絕對路徑,也可以為相對于工程(即.dsp文件)所在目錄的相對路徑。如果頭文件比較多,可以在project>settings>c/c++>preprocessor的Additional include directories中填入你的頭文件所在目,或者在VC6.0里面,IDE設置是在Tools=〉Options=〉Directories中設置(^_^,從這個地方可以看出project->settting與Tools->Options->Directories的區(qū)別與聯(lián)系。前者是針對當前工程的;后者是針對整個vc開發(fā)環(huán)境的,即一旦在Tools->Options->Directories進行了某個設置后,以后只要打開vc環(huán)境,仍然還是這個設置!!)
?
?
<3>?在工程中使用靜態(tài)庫中的函數(shù);
?
分割線///
?
VC環(huán)境下的動態(tài)庫使用
二.???動態(tài)鏈接庫一般包括.lib(導入庫),.h,.dll文件,使用動態(tài)庫有兩種情況:
A?.??隱式鏈接:load-time dynamic linking
同使用靜態(tài)庫相似,分為三步:引用.lib導入庫(此時把Dll和lib 后綴的文件都要放進來),包含頭文件(h后綴文件),使用導出函數(shù);
此種方法的好處是:可以像使用靜態(tài)庫一樣直接調(diào)用函數(shù)
缺點:程序啟動時加載所有需要的DLL,延長啟動時間,效率低。
這種做法成功的原因是:導入庫lib中包含了dll文件中導出函數(shù)的位置,所以當調(diào)用某個函數(shù)時,就知道去執(zhí)行dll中該函數(shù)的函數(shù)體。
B.???動態(tài)加載:run-time dynamic linking
直接使用LoadLibrary或LoadLibraryEx?加載所需的動態(tài)庫(并不需要對應的頭文件.h,和LIB),然后指定所需的導出函數(shù),效率最高!,但前提需要對DLL庫有比較詳細的了解。
缺點:需要使用GetProcessAddress()得到函數(shù)指針,函數(shù)調(diào)用相對麻煩。
?這種做法成功的原因是:通過LoadLibrary強行將dll文件加載到內(nèi)存,然后通過GetProcessAddress()函數(shù)取得你所要調(diào)用的函數(shù)的地址,然后通過該地址去執(zhí)行dll文件中該函數(shù)的函數(shù)體。
?/分割線//
至此,已經(jīng)可以正確使用了!
?
三、以下皆為使用備注,可以不看,只是為了幫助理解。
1.基本概念:
目標庫(靜態(tài)庫):
??擴展名.lib,靜態(tài)連接,其代碼會加入到可執(zhí)行程序中。
動態(tài)庫:
??擴展名.dll,動態(tài)鏈接,發(fā)生在運行時。
輸入庫(導入庫):
??擴展名.lib,目標庫的一種特殊形式。輸入庫不含代碼,而是為鏈接程序提供信息,以便在.exe文件中建立動態(tài)鏈接時要用到的重定位表。
??輸入庫是動態(tài)庫的輔助庫,在vc中隱式導入動態(tài)庫的時候用到該庫,需要在引用該庫的文件中包含該庫的頭文件??,并讓連接程序能找到該輸入庫的位置(放在同一目錄下或在vc中作相應的設置)。
??目標庫和輸入庫之用在程序的開發(fā)期間,動態(tài)庫在運行期間使用。
??一般來說,vb導入動態(tài)庫時用顯式導入(LoadLibrary),vc用隱式導入簡單一些。
2.兩種lib的不同
目前以lib后綴的庫有兩種,一種為靜態(tài)鏈接庫(Static Libary,以下簡稱“靜態(tài)庫”),另一種為動態(tài)連接庫(DLL,以下簡稱“動態(tài)庫”)的導入庫(Import Libary,以下簡稱“導入庫”)。?
靜態(tài)庫是一個或者多個obj文件的打包,所以有人干脆把從obj文件生成lib的過程稱為Archive,即合并到一起。比如你鏈接一個靜態(tài)庫,如果其中有錯,它會準確的找到是哪個obj有錯,即靜態(tài)lib只是殼子。?
動態(tài)庫一般會有對應的導入庫,方便程序靜態(tài)載入動態(tài)鏈接庫(即導入庫lib也被鏈接到exe文件中去),否則你可能就需要自己LoadLibary調(diào)入DLL文件,然后再手工GetProcAddress獲得對應函數(shù)了。有了導入庫,你只需要鏈接導入庫后按照頭文件函數(shù)接口的聲明調(diào)用函數(shù)就可以了。?
導入庫和靜態(tài)庫的區(qū)別很大,他們實質(zhì)是不一樣的東西。靜態(tài)庫本身就包含了實際執(zhí)行代碼、符號表等等,而對于導入庫而言,其實際的執(zhí)行代碼位于動態(tài)庫中,導入庫只包含了地址符號表等,確保程序找到對應函數(shù)的一些基本地址信息;相同點:都被鏈接到exe文件中去。
3開源代碼發(fā)布的慣用方式:
(1).?預編譯的開發(fā)包:包含一些.dll文件和一些.lib文件。其中這里的.lib就是導入庫,而不要錯以為是靜態(tài)庫。但是引入方式和靜態(tài)庫一樣,要在鏈接路徑上添加找到這些.lib的路徑。而.dll則最好放到最后產(chǎn)生的應用程序exe執(zhí)行文件相同的目錄。這樣運行時,就會自動調(diào)入動態(tài)鏈接庫。
(2).?用戶自己編譯:下載的是源代碼,按照readme自己編譯。生成很可能也是.dll + .lib(導入庫)的庫文件
(3).?如果你只有dll,并且你知道dll中函數(shù)的函數(shù)原型,那么你可以直接在自己程序中使用LoadLibary調(diào)入DLL文件,GetProcAddress
4.一些導入函數(shù)的介紹:
LoadLibrary
?一般是動態(tài)加載DLL時(你并不需要對應的頭文件,和LIB),顯示加載dll中函數(shù),前提是你自己對dll導出的函數(shù)參數(shù)很了解.
#pragma comment
一般是靜態(tài)加載DLL時(對應的頭文件、DLL,和LIB缺一不可,并且生產(chǎn)的EXE沒有找到DLL文件就會導致“應用程序初始化失敗”)
#import
導入的dll是com組建的dll,主要用來解析com組建內(nèi)部結構,便與c++識別調(diào)用?
?
總結
以上是生活随笔為你收集整理的VC环境下的静态库(lib)使用和动态库(Dll)的使用(清晰版)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 中class,PHP5中的类(c
- 下一篇: 16道嵌入式C语言面试题(转载)