當(dāng)前位置:首頁 > IT技術(shù) > Windows編程 > 正文

【合并lib】windows下多個lib合并的方法|查看lib是導(dǎo)入庫還是靜態(tài)庫
2021-09-28 16:50:44

靜態(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

開通會員,享受整站包年服務(wù)立即開通 >