【问题标题】:How do I use a third-party DLL file in Visual Studio C++?如何在 Visual Studio C++ 中使用第三方 DLL 文件?
【发布时间】:2010-10-04 11:49:22
【问题描述】:

我了解我需要使用 LoadLibrary()。但是我还需要采取哪些其他步骤才能使用第三方 DLL 文件?

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

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

【问题讨论】:

  • 你了解如何在 Visual Studio 2012 for C++ 中添加第三方 dll 文件吗?请帮我解决这个问题。

标签: c++ visual-studio winapi dll


【解决方案1】:

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

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

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

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

【讨论】:

  • 还有第三种方式,类似于您的第一种方式,使用/MT 开关,它将静态链接您的库。优点是there is no dynamic linking overhead。但是,如果您还使用/clr 开关,则无法使用此选项。
  • 这只适用于标准库。对于自定义库(第三方),您无法静态链接 dll,除非有人明确构建了您可以链接的静态版本。
  • @Laserallan 我正在开发一个 DLL 项目,但是当我构建它时,它只是创建了 dlllib 文件。它没有创建includes 目录。如何在项目中包含我的头文件?
  • dll/import 库是链接器的输出。在提供包含内容时,您需要确保它们全部分发在一起。如何执行此操作取决于您的构建系统,但如果使用 cmake,请查看 install 系列命令,这将帮助您决定以结构化方式分发的重要文件
【解决方案2】:

为了将第三方 DLL 合并到我的 VS 2008 C++ 项目中,我执行了以下操作(您应该能够翻译成 2010、2012 等)...

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

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

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

(您必须为您使用的每个源构建目标(调试、发布)进行下一组更改。)

  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

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

    • 转到配置属性 -> 常规 -> 清除时要删除的扩展,然后单击“...”;将*.dll 添加到列表末尾,然后单击OK

【讨论】:

  • 我正在尝试使用您的方法来使用第三方 dll。我正在使用 Visual Studio 2012 Ultimate,它在 Configuration Properties -> General 选项卡中没有 Additional Library Directories。请帮帮我。
  • 应该是Configuration Properties -> Linker -> General -> Additional Library Directories
  • @afzalex 您可以在配置属性 > VC++ 目录 > 库目录中找到它。这是一代人的转变;)
  • 第 2 步的引用未放置。使用:XCOPY "$(SolutionDir)\lib\*.DLL" "$(TargetDir)" /D /K /Y
  • @TristanCHARBONNIER 很有趣。我很确定我从我的工作配置中复制/粘贴了我的XCOPY 命令。您是说引用错误是因为它对您不起作用,还是只是猜测?
【解决方案3】:

为了将 Qt 与动态链接一起使用,您必须在
Properties » Linker » Input » Additional Dependencies 中指定 lib 文件(通常是 qtmaind.libQtCored4.libQtGuid4.lib 用于“调试”配置)。

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

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

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

    • 谢谢,其他答案非常好(对我也很有用),但这正是我想要的。
    • “附加依赖项”对话框看起来只支持文件名和扩展名,不支持文件路径。添加文件名 + 扩展名并不能修复“未找到标识符”错误。添加完全限定的路径 + 文件名 + 也没有修复它们。
    • @advocate,“常规”选项卡上有一个“附加库目录”条目。我不知道微软为什么将它们分开。
    • 我确实这样做了,但我仍然收到链接器错误。我已将我的 .dll 文件放入我的 C:/Windows 中。我做错了什么?
    • @darkgaze 您可以使用#import 自动生成并包含 DLL 的头文件。编译器需要知道所有函数的声明,以便构建调用代码。
    【解决方案5】:

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


    回复您的编辑:

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

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多