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