2013-11-26 49 views
11

我有一個關於庫鏈接和.lib文件的問題...爲什麼某些DLL文件需要額外的.lib文件進行鏈接?

這是上下文:

  • OS =的Windows
  • IDE = QT

我創建了一個DLL:MyLib.dll。
要使用該庫在我的Qt項目,我只需要包括包括路徑,鏈接庫,並使用頭文件:

LIBS += "C:\myPath\MyLib.dll" 
INCLUDEPATH += "C:\myPath" 
HEADERS += \ 
    ../myPath/MyLib_global.h \ 
    ../myPath/mylib.h 

我用我的項目第三方DLL:第三.DLL
如果我做的一樣,在上面的例子中,這是行不通的:

LIBS += "C:\myPath\third.dll" 

第三方DLL自帶的.lib文件「third.lib」,這顯然是我需要同時使用與DLL。

這是爲什麼?爲什麼某些DLL庫需要.lib文件,但其他DLL庫不需要?
難道是.lib是一個訪問DLL的靜態庫嗎?

非常感謝!

回答

4

該lib文件是一個導入庫文件,該文件允許最終的可執行文件包含引用所有DLL函數調用的導入地址表(IAT)。基本上,允許查找功能。

你可以閱讀關於它here

要讓Qt的產生的lib,這增加了的.pro: - 如何創建庫

CONFIG+= staticlib 

Here's一些文檔。

+0

謝謝@ Merlin069爲您解答。澄清它!有一件事:當我創建myLib.dll時,我沒有看到用DLL文件生成lib文件的任何方法。那是在構建DLL時的選項嗎?此外,我的DLL中的所有函數調用似乎都可以在沒有lib文件的情況下訪問。那不是.lib文件應該允許的?謝謝 – WewillSee

+0

默認情況下應該有一個導入庫。 – ExpatEgghead

+0

如果IDE文件尚未生成lib文件,那麼IDE中可能會有一個設置。據我瞭解,如果沒有lib文件,你可以單獨加載dll並調用函數,但是如果你想用靜態庫構建一個可執行文件,lib是必需的。 – TheDarkKnight

3

我的答案可能不是特定於上下文,但對於大多數開發人員詢問相同問題會有幫助。這是回答了安東尼·威廉姆斯

What is inside .lib file of Static library, Statically linked dynamic library and dynamically linked dynamic library?

你不需要的.lib文件中使用一個動態庫,但沒有一個 你不能在你的 代碼對待從DLL作爲正常功能的功能。相反,您必須手動調用LoadLibrary來加載DLL(完成後可以使用FreeLibrary),然後使用GetProcAddress來獲取DLL中函數或數據項的 地址。然後您必須將 的返回地址轉換爲適當的指針函數,以便 使用它。

相關問題