靜態(tài)庫(kù):VS工程設(shè)置為生成lib
導(dǎo)入庫(kù):VS工程設(shè)置為生生成DLL,VS生成DLL的同時(shí) 生成一個(gè)lib,這個(gè)就是導(dǎo)入庫(kù)。只記錄函數(shù)在DLL的位置沒(méi)有實(shí)現(xiàn)函數(shù)
?
?
方法一:
?????? VS項(xiàng)目-》屬性-》配置屬性-》庫(kù)管理器-》常規(guī)-》附加依賴項(xiàng)---> 添加需要合并的靜態(tài)庫(kù)lib
?????? --->附加庫(kù)目錄??? 添加需要合并的靜態(tài)庫(kù)lib 所在的路徑
方法二:
??? 開(kāi)始-》所有程序-》Microsoft Visual studio 2010-》visual studio tools-》Visual studio 命令提示符
??? 在出來(lái)的Dos窗口中,輸入命令:
? lib.exe /out:objectlib.lib lib1.lib lib2.lib
該目錄下會(huì)生成合并后的lib庫(kù)object.lib
? (或lib.exe /out:D:objectlib.lib?? D:mylib*.lib?? 將D:mylib目錄下的lib合并為objectlib.lib)存在D目錄下)
?? ?
?
查看lib是導(dǎo)入庫(kù)還是靜態(tài)庫(kù)的方法
lib /list [文件名] 顯示dll的是導(dǎo)入庫(kù),顯示.obj或者.o是靜態(tài)庫(kù)
例如:
? 開(kāi)始-》所有程序-》Microsoft Visual studio 2010-》visual studio tools-》Visual studio 命令提示符
lib.exe? /list?? C:/a.lib
?
?
lib導(dǎo)入庫(kù)有什么用?通過(guò)前面三篇的介紹,靜態(tài)lib庫(kù),就完全講清楚了。那么這里我們來(lái)介紹一下lib導(dǎo)入庫(kù)。雖然lib導(dǎo)入庫(kù)不是很重要,但是為了方便使用dll,lib導(dǎo)入庫(kù)還是很常用。但是沒(méi)有l(wèi)ib導(dǎo)入庫(kù),也是可以使用dll的。所以說(shuō),lib導(dǎo)入庫(kù)是一個(gè)附加的增值產(chǎn)品。
???dll是用來(lái)動(dòng)態(tài)鏈接的,也就是程序運(yùn)行時(shí)才鏈接的。靜態(tài)鏈接就是在生成exe時(shí)就鏈接到exe里了。鏈接最終的目的是要將dll載入到和exe同一個(gè)進(jìn)程空間中。盡管這里是動(dòng)態(tài)鏈接,它只是在鏈接的時(shí)間上延遲罷了。靜態(tài)鏈接時(shí),直接在生成時(shí)將庫(kù)的內(nèi)容放在了exe中,當(dāng)exe文件加載到內(nèi)存時(shí),鏈接的庫(kù)的內(nèi)容也加載到內(nèi)存了。動(dòng)態(tài)鏈接庫(kù)dll則是在生成exe的時(shí)候只用了一個(gè)占位表,叫做重定位表。然后在exe需要的時(shí)候,再將dll加載到exe所在的進(jìn)程的內(nèi)存空間中。
???所以說(shuō),不管是靜態(tài)鏈接還是動(dòng)態(tài)鏈接,最終都是要到exe的進(jìn)程內(nèi)存空間中的,是跑不了的。躲得了初一躲不了十五,dll只是延遲加載到內(nèi)存罷了。
???我們要使用dll,為了方便知道dll中的所有函數(shù)都在什么位置,就用上了lib導(dǎo)入庫(kù)。這個(gè)導(dǎo)入庫(kù)記錄了dll中的所有函數(shù)在dll中的位置,那么我們引入了lib導(dǎo)入庫(kù)之后,在運(yùn)行的時(shí)候,在加載了dll后,就可以方便的定位需要的函數(shù)了。有了這個(gè)lib導(dǎo)入庫(kù),我們不需要手動(dòng)的去找dll中的函數(shù)了。使用dll就和靜態(tài)lib庫(kù)或者和直接的源碼中寫(xiě)的函數(shù)一樣簡(jiǎn)單。
???另一種就不用lib導(dǎo)入庫(kù)了,使用API函數(shù)LoadLibrary來(lái)加載dll到內(nèi)存中,然后使用API函數(shù)GetProcAddress來(lái)找到dll中的函數(shù)地址。這里的使用,將在dll的專題中講解,就不多述了。
?
?
本文摘自 :https://blog.51cto.com/l