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