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

问题描述:

我知道我需要使用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

正如其他人所说,LoadLibrary是难以实现的方式,而且几乎没有必要。

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

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

+1

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

这些都是在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

我想你可以使用它,那么第三方库应该有一个* .lib文件以及一个* .dll文件。您只需将* .lib添加到项目“链接器”选项中的输入文件列表中即可。这个* .lib文件不一定是一个'静态'库(它包含代码):相反,* .lib可能只是一个将您的可执行文件链接到DLL的文件。

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


在回答您的编辑:

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

为了使用Qt动态链接时,你有
Properties » Linker » Input » Additional Dependencies指定lib文件(通常qtmaind.libQtCored4.libQtGuid4.lib的“调试” CONFIGRATION)。

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

而你需要做相应的.dll s为在运行时可以访问,通过在同一个文件夹或者将其存储为您.exe或文件夹是你的路径上英寸

要整合第三方的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