日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

VC环境下的静态库(lib)使用和动态库(Dll)的使用(清晰版)

發(fā)布時(shí)間:2025/3/12 c/c++ 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VC环境下的静态库(lib)使用和动态库(Dll)的使用(清晰版) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

VC環(huán)境下的靜態(tài)庫(kù)使用

.??靜態(tài)庫(kù)包括.lib和.h文件,在工程中使用靜態(tài)庫(kù)分為3步:

<1>?在工程中加入靜態(tài)庫(kù),有三種方法:

????? **方法一:項(xiàng)目設(shè)置中引用.lib,project->?? setting->?? link->?? object/library modules中添加.lib;(可以在這里指定路徑,也可以在project>settings>link>input的Additional library path中輸入.lib文件所在路徑,還可以在project->settting與Tools->Options->Directories指定路徑,具體區(qū)別見(jiàn)<2>)

????? **方法二:在項(xiàng)目中直接加入lib,project->?? add to project->?? files,選擇正確的.lib。

? ? ? **方法三:pragma comment(lib, "##/##/mine.lib")?,路徑名,系統(tǒng)會(huì)優(yōu)先查找環(huán)境path

?

?

?

<2>?在工程中包括.h文件;

在應(yīng)用程序工程中使用

#include "file path"

*file path可以為絕對(duì)路徑,也可以為相對(duì)于工程(即.dsp文件)所在目錄的相對(duì)路徑。如果頭文件比較多,可以在project>settings>c/c++>preprocessor的Additional include directories中填入你的頭文件所在目,或者在VC6.0里面,IDE設(shè)置是在Tools=〉Options=〉Directories中設(shè)置(^_^,從這個(gè)地方可以看出project->settting與Tools->Options->Directories的區(qū)別與聯(lián)系。前者是針對(duì)當(dāng)前工程的;后者是針對(duì)整個(gè)vc開(kāi)發(fā)環(huán)境的,即一旦在Tools->Options->Directories進(jìn)行了某個(gè)設(shè)置后,以后只要打開(kāi)vc環(huán)境,仍然還是這個(gè)設(shè)置!!)

?

?

<3>?在工程中使用靜態(tài)庫(kù)中的函數(shù);

?

分割線///

?

VC環(huán)境下的動(dòng)態(tài)庫(kù)使用

二.???動(dòng)態(tài)鏈接庫(kù)一般包括.lib(導(dǎo)入庫(kù)),.h,.dll文件,使用動(dòng)態(tài)庫(kù)有兩種情況:

A?.??隱式鏈接:load-time dynamic linking

同使用靜態(tài)庫(kù)相似,分為三步:引用.lib導(dǎo)入庫(kù)(此時(shí)把Dll和lib 后綴的文件都要放進(jìn)來(lái)),包含頭文件(h后綴文件),使用導(dǎo)出函數(shù);

此種方法的好處是:可以像使用靜態(tài)庫(kù)一樣直接調(diào)用函數(shù)

缺點(diǎn):程序啟動(dòng)時(shí)加載所有需要的DLL,延長(zhǎng)啟動(dòng)時(shí)間,效率低。

這種做法成功的原因是:導(dǎo)入庫(kù)lib中包含了dll文件中導(dǎo)出函數(shù)的位置,所以當(dāng)調(diào)用某個(gè)函數(shù)時(shí),就知道去執(zhí)行dll中該函數(shù)的函數(shù)體。

B.???動(dòng)態(tài)加載:run-time dynamic linking

直接使用LoadLibrary或LoadLibraryEx?加載所需的動(dòng)態(tài)庫(kù)(并不需要對(duì)應(yīng)的頭文件.h,和LIB),然后指定所需的導(dǎo)出函數(shù),效率最高!,但前提需要對(duì)DLL庫(kù)有比較詳細(xì)的了解。

缺點(diǎn):需要使用GetProcessAddress()得到函數(shù)指針,函數(shù)調(diào)用相對(duì)麻煩。

?這種做法成功的原因是:通過(guò)LoadLibrary強(qiáng)行將dll文件加載到內(nèi)存,然后通過(guò)GetProcessAddress()函數(shù)取得你所要調(diào)用的函數(shù)的地址,然后通過(guò)該地址去執(zhí)行dll文件中該函數(shù)的函數(shù)體。

?/分割線//

至此,已經(jīng)可以正確使用了!

?

三、以下皆為使用備注,可以不看,只是為了幫助理解。

1.基本概念:

目標(biāo)庫(kù)(靜態(tài)庫(kù)):
??擴(kuò)展名.lib,靜態(tài)連接,其代碼會(huì)加入到可執(zhí)行程序中。
動(dòng)態(tài)庫(kù):
??擴(kuò)展名.dll,動(dòng)態(tài)鏈接,發(fā)生在運(yùn)行時(shí)。
輸入庫(kù)(導(dǎo)入庫(kù)):
??擴(kuò)展名.lib,目標(biāo)庫(kù)的一種特殊形式。輸入庫(kù)不含代碼,而是為鏈接程序提供信息,以便在.exe文件中建立動(dòng)態(tài)鏈接時(shí)要用到的重定位表。
??輸入庫(kù)是動(dòng)態(tài)庫(kù)的輔助庫(kù),在vc中隱式導(dǎo)入動(dòng)態(tài)庫(kù)的時(shí)候用到該庫(kù),需要在引用該庫(kù)的文件中包含該庫(kù)的頭文件??,并讓連接程序能找到該輸入庫(kù)的位置(放在同一目錄下或在vc中作相應(yīng)的設(shè)置)。
??目標(biāo)庫(kù)和輸入庫(kù)之用在程序的開(kāi)發(fā)期間,動(dòng)態(tài)庫(kù)在運(yùn)行期間使用。
??一般來(lái)說(shuō),vb導(dǎo)入動(dòng)態(tài)庫(kù)時(shí)用顯式導(dǎo)入(LoadLibrary),vc用隱式導(dǎo)入簡(jiǎn)單一些。

2.兩種lib的不同

目前以lib后綴的庫(kù)有兩種,一種為靜態(tài)鏈接庫(kù)(Static Libary,以下簡(jiǎn)稱“靜態(tài)庫(kù)”),另一種為動(dòng)態(tài)連接庫(kù)(DLL,以下簡(jiǎn)稱“動(dòng)態(tài)庫(kù)”)的導(dǎo)入庫(kù)(Import Libary,以下簡(jiǎn)稱“導(dǎo)入庫(kù)”)。?
靜態(tài)庫(kù)是一個(gè)或者多個(gè)obj文件的打包,所以有人干脆把從obj文件生成lib的過(guò)程稱為Archive,即合并到一起。比如你鏈接一個(gè)靜態(tài)庫(kù),如果其中有錯(cuò),它會(huì)準(zhǔn)確的找到是哪個(gè)obj有錯(cuò),即靜態(tài)lib只是殼子。?
動(dòng)態(tài)庫(kù)一般會(huì)有對(duì)應(yīng)的導(dǎo)入庫(kù),方便程序靜態(tài)載入動(dòng)態(tài)鏈接庫(kù)(即導(dǎo)入庫(kù)lib也被鏈接到exe文件中去),否則你可能就需要自己LoadLibary調(diào)入DLL文件,然后再手工GetProcAddress獲得對(duì)應(yīng)函數(shù)了。有了導(dǎo)入庫(kù),你只需要鏈接導(dǎo)入庫(kù)后按照頭文件函數(shù)接口的聲明調(diào)用函數(shù)就可以了。?
導(dǎo)入庫(kù)和靜態(tài)庫(kù)的區(qū)別很大,他們實(shí)質(zhì)是不一樣的東西。靜態(tài)庫(kù)本身就包含了實(shí)際執(zhí)行代碼、符號(hào)表等等,而對(duì)于導(dǎo)入庫(kù)而言,其實(shí)際的執(zhí)行代碼位于動(dòng)態(tài)庫(kù)中,導(dǎo)入庫(kù)只包含了地址符號(hào)表等,確保程序找到對(duì)應(yīng)函數(shù)的一些基本地址信息;相同點(diǎn):都被鏈接到exe文件中去。

3開(kāi)源代碼發(fā)布的慣用方式:

(1).?預(yù)編譯的開(kāi)發(fā)包:包含一些.dll文件和一些.lib文件。其中這里的.lib就是導(dǎo)入庫(kù),而不要錯(cuò)以為是靜態(tài)庫(kù)。但是引入方式和靜態(tài)庫(kù)一樣,要在鏈接路徑上添加找到這些.lib的路徑。而.dll則最好放到最后產(chǎn)生的應(yīng)用程序exe執(zhí)行文件相同的目錄。這樣運(yùn)行時(shí),就會(huì)自動(dòng)調(diào)入動(dòng)態(tài)鏈接庫(kù)。

(2).?用戶自己編譯:下載的是源代碼,按照readme自己編譯。生成很可能也是.dll + .lib(導(dǎo)入庫(kù))的庫(kù)文件

(3).?如果你只有dll,并且你知道dll中函數(shù)的函數(shù)原型,那么你可以直接在自己程序中使用LoadLibary調(diào)入DLL文件,GetProcAddress

4.一些導(dǎo)入函數(shù)的介紹:

LoadLibrary

?一般是動(dòng)態(tài)加載DLL時(shí)(你并不需要對(duì)應(yīng)的頭文件,和LIB),顯示加載dll中函數(shù),前提是你自己對(duì)dll導(dǎo)出的函數(shù)參數(shù)很了解.
#pragma comment

一般是靜態(tài)加載DLL時(shí)(對(duì)應(yīng)的頭文件、DLL,和LIB缺一不可,并且生產(chǎn)的EXE沒(méi)有找到DLL文件就會(huì)導(dǎo)致“應(yīng)用程序初始化失敗”)
#import

導(dǎo)入的dll是com組建的dll,主要用來(lái)解析com組建內(nèi)部結(jié)構(gòu),便與c++識(shí)別調(diào)用?

?

總結(jié)

以上是生活随笔為你收集整理的VC环境下的静态库(lib)使用和动态库(Dll)的使用(清晰版)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。