2009-01-30 277 views
58

我知道我需要使用LoadLibrary()。但是,爲了使用第三方DLL文件,還需要執行哪些其他步驟?如何在Visual Studio C++中使用第三方DLL文件?

我只是跳入C++,這是我沒有得到的唯一部分(作爲Java程序員)。我只是在研究如何使用Qt庫和tesseract-ocr,但這個過程對我來說沒有意義,而且對谷歌來說非常困難。

如何告訴編譯器我正在使用的函數?是否應該有來自第三方供應商的包含文件?

+0

您是否知道如何在Visual Studio 2012 for C++中添加第三方dll文件。請幫我解決一下這個。 – afzalex 2015-07-06 15:37:13

回答

59

正如其他人所說,LoadLibrary是難以實現的方式,而且幾乎沒有必要。

該DLL應該帶有一個用於鏈接的.lib文件,以及一個或多個頭文件到#include到源代碼中。頭文件將定義可以從DLL中使用的類和函數原型。即使使用LoadLibrary,您也需要這個。

要與庫鏈接,您可能需要將.lib文件添加到鏈接器/輸入/附加依賴關係下的項目配置。

+1

謝謝,其他答案非常好(對我也很有用),但是這正是我想要的。 – Zombies 2009-01-30 15:28:44

24

這些都是在Windows上使用的DLL文件的方法有兩種:

  1. 有一種存根庫(.LIB)與相關的頭文件。當您將可執行文件鏈接到lib文件時,它會在啓動程序時自動加載DLL文件。

  2. 手動加載DLL。如果您正在開發一個插件系統,其中有許多DLL文件實現一個通用接口,那麼這通常是您想要做的。查看關於LoadLibraryGetProcAddress的文檔以獲取更多信息。

對於Qt我會懷疑有頭文件和一個靜態庫可用,你可以在你的項目中包含和鏈接。

+0

還有第三種方法,類似於你的第一種方式,使用`/ MT`開關,它將靜態鏈接你的庫。優點是[沒有動態鏈接開銷](http://www.codeproject.com/Articles/85391/Microsoft-Visual-C-Static-and-Dynamic-Libraries#StaticLibraryProperties)。但是,如果您也使用`/ clr`開關,則無法使用此功能。 – Abel 2014-11-08 01:32:21

+2

這隻適用於標準庫。對於自定義庫(第三方),除非有人明確構建了可以鏈接的靜態版本,否則無法靜態鏈接dll。 – Laserallan 2014-11-09 18:26:13

2

我想你可以使用它,那麼第三方庫應該有一個* .lib文件以及一個* .dll文件。您只需將* .lib添加到項目「鏈接器」選項中的輸入文件列表中即可。這個* .lib文件不一定是一個'靜態'庫(它包含代碼):相反,* .lib可能只是一個將您的可執行文件鏈接到DLL的文件。

3

如果要在運行時延遲綁定並僅解析導入的函數,則只需要使用LoadLibrary。使用第三方DLL的最簡單方法是鏈接到.lib。


在回答您的編輯:

是,第三方API應該由一個DLL和/或包含聲明所需類型的實現和頭文件一個lib的。無論使用哪種方法,您都需要知道類型定義 - 對於LoadLibrary,您需要定義函數指針,以便您可以輕鬆編寫自己的頭文件。基本上,如果你想延遲綁定,你只需要使用LoadLibrary。一個有效的原因是如果你不確定dll是否可以在目標PC上使用。

6

爲了使用Qt動態鏈接時,你有
Properties » Linker » Input » Additional Dependencies指定lib文件(通常qtmaind.libQtCored4.libQtGuid4.lib的「調試」 CONFIGRATION)。

您也可以指定路徑在庫是,即
Properties » Linker » General » Additional Library Directories

而你需要做相應的.dll s爲在運行時可以訪問,通過在同一個文件夾或者將其存儲爲您.exe或文件夾是你的路徑上英寸

51

要整合第三方的DLL到我的VS 2008的C++項目,我做了以下(你應該能夠轉化爲2010年,2012等)......

我把頭文件在我的解決方案與我的其他頭文件,更改我的代碼來調用DLL的函數(否則爲什麼我們會這樣做?)。 :^)然後我改變了構建,將LIB代碼鏈接到我的EXE中,將DLL複製到位,並在清理時清理它們 - 我在下面解釋這些更改。

假設您有兩個第三方DLL,A.DLL和B.DLL,並且每個(A.LIB和B.LIB)和頭文件(A.H和B.H)都有一個存根LIB文件。

  • 在您的解決方案目錄下創建一個「lib」目錄,例如,使用Windows資源管理器
  • 第三方.LIB和.dll文件複製到該目錄

(你將不得不作出下一組變化的一次,您使用(調試,發佈),每個源構建目標。 )

  1. 讓您的EXE取決於LIB文件

    • 轉到配置屬性 - >鏈接器 - >輸入 - >附加依賴,並列出您的.lib文件有一次一個,separa通過空間A.LIB B.LIB
    • 轉到配置屬性 - >常規 - >其他庫目錄,並將您的「lib」目錄添加到任何你已經在那裏。條目之間用分號分隔。例如,如果您已有$(SolutionDir)fodder,則將其更改爲$(SolutionDir)fodder;$(SolutionDir)lib以添加「lib」。
  2. 強制DLL文件被複制到輸出目錄

    • 轉到配置屬性 - >生成事件 - >生成後事件
    • 將下面的命令行(爲切換含義,請參閱「XCOPY /?在「DOS窗口):

    XCOPY "$(SolutionDir)"\lib\*.DLL "$(TargetDir)" /D /K /Y

    • 你可以把像這樣的描述:

    Copy DLLs to Target Directory

    • 排除從生成應No 。點擊OK
  3. 告訴VS清理DLL時清理它的輸出文件夾:

    • 轉到配置屬性 - >常規 - >擴展刪除清潔,並點擊「...」 ;將*.dll添加到列表的末尾,然後單擊OK
相關問題