dll文件和lib文件

參考了這篇文章http://www.cppblog.com/amazon/archive/2009/09/04/95318.htmlhttp://wenku.baidu.com/view/d9a6520e7cd184254b3535b4.html做個簡明總結。

我們在程序中使用“pragma comment(lib, "a.lib")這個不一定是靜態鏈接,這個只是告訴編譯器,a.lib中包含我們源碼中使用的函數的定位信息。我們使用這個語句的場景:

1.靜態鏈接場景

我們用visual studio創建一個靜態鏈接庫的win32程序,生成一個a.lib,這個a.lib已經包含實際的二進制可執行代碼,exe程序已經包含了a.lib的二進制代碼,因此,exe程序可以獨立運行,不需要a.lib附加文件。

2.動態鏈接場景

我們創建一個動態鏈接庫,會產生兩個文件,一個是a.lib,一個是a.dll。這裏a.lib只是包含如何根據函數名或者序號找到他們在a.dll中實際的二進制代碼位置,只是個索引。a.dll才包含真正的二進制代碼。這樣我們就可以包含一個.h的函數說明文件,然後在源碼中直接使用函數,此時a.lib和a.dll都是exe程序執行必須附帶的文件。

另外一種情況,就是我們對於動態生成的動態鏈接庫的a.lib和a.dll,我們現在假設不想使用a.lib,那麼我們就不需要加入相應函數聲明的.h文件,而是使用系統函數LoadLibrary來獲取相應函數的指針,只需要一個a.dll就足夠了,系統會分析函數位置並動態加載他。

靜態就是運行前就已經融合到可執行代碼中的,導致文件大小增大。動態是運行時有可執行代碼根據需要來加載,事前的文件比較小,但是增加了加載和尋找需要的函數的時間開銷。

3.對於靜態鏈接庫,經過試驗,如果只是採用#pragma comment(lib, "test.lib")這種形式,無論test.lib是否存在,都不影響項目的生成,這時test.lib只是作爲一個提示。如果你拿着生成的lib,去給exe或者dll鏈接,它們就會在鏈接時報錯,說找不到test.lib。如果test.lib作爲vc的靜態庫項目的"附加依賴項",那麼,test.lib就會被合併到最終生成的lib中去,所以此時如果找不到test.lib就會導致無法生成項目的lib。靜態鏈接庫項目中的”附加依賴項“中的lib會合並,也就是說,相當於我們執行類似的操作 lib.exe /out:all_in_one.lib a1.lib a2.lib,該操作的意思是合併a1.lib和a2.lib爲一個名叫all_in_one.lib的靜態庫。

4.lib.exe還有很多其他選項,可以搜索 ”lib.exe msdn"瞭解詳情

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章