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

我明白我需要使用LoadLibrary()。 但是,为了使用第三方DLL文件,还需要执行哪些其他步骤?

我只是跳到C ++,这是我没有得到的唯一部分(作为Java程序员)。 我正在研究如何使用Qt库和tesseract-ocr,但是这个过程对我来说没有任何意义,而且对于google来说非常困难。

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

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

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

要链接库,可能需要将.lib文件添加到链接器/input/附加依赖关系下的项目configuration中。

为了将第三方DLL合并到我的VS 2008 C ++项目中,我做了以下工作(你应该能够翻译成2010,2012等)。

我把我的解决scheme中的头文件与我的其他头文件,改变我的代码来调用DLL的function(否则为什么我们会做这一切?)。 :^)然后我改变了构build链接LIB代码到我的EXE中,将DLL复制到位,清理它们,当我做了一个'干净' – 我解释下面的这些变化。

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

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

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

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

    • 转到configuration属性 – >链接器 – >input – >其他依赖项,并列出你的.LIB文件,每次一个,用空格分隔: A.LIB B.LIB
    • 转到configuration属性 – >常规 – >其他库目录,并将您的“lib”目录添加到您已经在那里。 条目以分号分隔 。 例如,如果您已经有$(SolutionDir)fodder ,则将其更改为$(SolutionDir)fodder;$(SolutionDir)lib以添加“lib”。
  2. 强制将DLL复制到输出目录

    • 转到configuration属性 – >生成事件 – >生成后事件
    • 把下面的命令行(对于开关意义,请参阅DOS窗口中的“XCOPY /?”):

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

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

    Copy DLLs to Target Directory

    • 排除从生成应该是No 。 点击OK
  3. 告诉VS在清理输出文件夹时清理DLL:

    • 转到configuration属性 – >常规 – >扩展删除干净,然后单击“…”; 将*.dll添加到列表的末尾,然后单击OK

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

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

  2. 手动加载DLL。 如果您正在开发一个插件系统,其中有许多DLL文件实现一个通用接口,那么这通常是您想要做的。 查看LoadLibrary和GetProcAddress的文档以获取更多信息。

对于Qt我会怀疑有标题和一个静态库可用,你可以包括和链接到你的项目。

为了在dynamic链接中使用Qt,你必须指定lib文件(通常是QtCored4.libQtCored4.libQtGuid4.lib用于“debugging”移植)
Properties » Linker » Input » Additional Dependencies

你还必须指定libs所在的path ,即in
Properties » Linker » General » Additional Library Directories

而且您需要使运行时可以访问相应的.dll文件,方法是将它们存储在与.exe相同的文件夹中或path中的文件夹中。

如果您想要延迟绑定并只在运行时parsing导入的函数,则只需要使用LoadLibrary。 使用第三方DLL最简单的方法是链接到.lib。


回复您的编辑:

是的,第三方API应该包含一个dll和/或一个包含声明所需types的实现和头文件的库。 您需要知道types定义,无论您使用哪种方法 – 对于LoadLibrary,您将需要定义函数指针,以便您可以轻松地编写自己的头文件。 基本上,如果你想延迟绑定,你只需要使用LoadLibrary。 一个有效的原因是如果你不确定在目标PC上是否可以访问该DLL。

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

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