如何在Visual Studio C ++中使用第三方DLL文件?

时间:2009-01-30 15:00:34

标签: c++ visual-studio winapi dll

我知道我需要使用LoadLibrary()。但是,为了使用第三方DLL文件,我需要采取哪些其他步骤?

我只是跳进了C ++,这是我唯一没有得到的部分(作为Java程序员)。我只是在研究如何使用Qt库和tesseract-ocr,但这个过程对我来说毫无意义,而且谷歌很难。

如何告诉编译器我正在使用的函数?是否应该有来自第三方供应商的包含文件?

6 个答案:

答案 0 :(得分:64)

正如其他人所说,LoadLibrary是很难做到的,几乎没有必要。

DLL应该带有一个用于链接的.lib文件,以及一个或多个头文件到#include到你的源代码中。头文件将定义可以从DLL中使用的类和函数原型。即使您使用LoadLibrary,也需要这样做。

要与库链接,您可能必须将.lib文件添加到链接器/输入/附加依赖项下的项目配置中。

答案 1 :(得分:62)

要将第三方DLL合并到我的VS 2008 C ++项目中,我执行了以下操作(您应该可以转换为2010年,2012年等)...

我把头文件和我的其他头文件一起放在我的解决方案中,对我的代码进行了更改以调用DLL的函数(否则我们为什么要这样做呢?)。 :^)然后我更改了构建以将LIB代码链接到我的EXE中,将DLL复制到位,并在我做“干净”时清理它们 - 我在下面解释这些更改。

假设您有2个第三方DLL,A.DLL和B.DLL,并且每个(A.LIB和B.LIB)和头文件(AH和BH)都有一个存根LIB文件。

  • 在您的解决方案目录下创建一个“lib”目录,例如使用Windows资源管理器。
  • 将第三方.LIB和.DLL文件复制到此目录

(您必须为您使用的每个源构建目标(Debug,Release)进行一次下一组更改。)

  1. 使您的EXE依赖于LIB文件

    • 转到配置属性 - >链接器 - >输入 - >其他依赖项,并一次列出一个.LIB文件,由空格分隔A.LIB B.LIB
    • 转到配置属性 - >一般 - >其他库目录,并将您的“lib”目录添加到您已有的任何目录。条目由分号分隔。例如,如果您已经有$(SolutionDir)fodder,则将其更改为$(SolutionDir)fodder;$(SolutionDir)lib以添加“lib”。
  2. 强制将DLL复制到输出目录

    • 转到配置属性 - >构建事件 - >建设后活动
    • 将以下命令用于命令行(对于开关含义,请参见DOS窗口中的“XCOPY /?”):

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

    • 你可以把这样的东西放在描述中:

    Copy DLLs to Target Directory

    • 从Build中排除应为No。 点击OK
  3. 告诉VS在清理输出文件夹时清理DLL:

    • 转到配置属性 - >一般 - >在Clean上删除扩展,然后单击“...”;将*.dll添加到列表末尾,然后点击OK

答案 2 :(得分:24)

这是在Windows中使用DLL文件的两种方法:

  1. 存在一个存根库(.lib),其中包含相关的头文件。当您将可执行文件与lib文件链接时,它将在启动程序时自动加载DLL文件。

  2. 手动加载DLL。如果您正在开发一个插件系统,其中有许多DLL文件实现了一个通用接口,这通常是您想要做的。有关详细信息,请查看LoadLibraryGetProcAddress的文档。

  3. 对于Qt,我怀疑有可用的标题和静态库,您可以在项目中包含和链接。

答案 3 :(得分:6)

为了将Qt与动态关联一起使用,您必须在<调整“移民”中指定lib个文件(通常为qtmaind.libQtCored4.libQtGuid4.lib。登记/>   Properties » Linker » Input » Additional Dependencies

您还必须指定库的路径,即在< Properties » Linker » General » Additional Library Directories

您需要在运行时访问相应的.dll,方法是将它们存储在与.exe相同的文件夹中,或者存储在路径的文件夹中

答案 4 :(得分:3)

如果要延迟绑定并且仅在运行时解析导入的函数,则只需要使用LoadLibrary。使用第三方dll的最简单方法是链接.lib。


回复您的修改:

是的,第三方API应该包含一个dll和/或一个lib,其中包含声明所需类型的实现和头文件。无论使用哪种方法,您都需要知道类型定义 - 对于LoadLibrary,您需要定义函数指针,因此您可以轻松编写自己的头文件。基本上,如果你想要后期绑定,你只需要使用LoadLibrary。一个有效的原因是,如果您不确定目标PC上是否可以使用该DLL。

答案 5 :(得分:2)

如果你能够使用它,那么第三方库应该有* .lib文件以及* .dll文件。您只需将* .lib添加到项目的“链接器”选项中的输入文件列表中。

这个* .lib文件不一定是'静态'库(包含代码):而* .lib可以只是一个将可执行文件链接到DLL的文件。