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


76

我了解我需要使用LoadLibrary()。但是,要使用第三方DLL文件,我还需要采取什么其他步骤?

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

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


您了解如何在Visual Studio 2012 for C ++中添加第三方dll文件。请帮我解决一下这个。
afzalex 2015年

Answers:


72

就像其他人所说的那样,LoadLibrary是很难做到的方法,而且几乎没有必要。

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

要与库链接,您可能必须将.lib文件添加到Linker / Input / Additional Dependencies下的项目配置中。


1
谢谢,其他答案都很好(对我也很有用),但这正好解释了我在寻找什么。
僵尸

“其他依赖项”对话框看起来仅支持文件名和扩展名,不支持文件路径。添加文件名+扩展名不能解决“找不到标识符”错误。添加完全限定的路径+文件名+也无法解决问题。
anon58192932'6

1
@拥护者,在“常规”选项卡上有一个“其他图书馆目录”条目。我不知道为什么微软将他们分开。
Mark Ransom 2012年

我实际上是这样做的,但是仍然出现Linker错误。我已将.dll文件放入C:/ Windows。我究竟做错了什么?
巴特2015年

1
您可以使用@darkgaze#import自动生成并包含DLL的头文件。编译器需要知道所有函数的声明,以便可以构建调用代码。
马克·兰瑟姆

67

要将第三方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

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

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

2
我正在尝试使用您的方法来使用第三方dll。我使用的Visual Studio 2012 Ultimate和它没有Additional Library DirectoriesConfiguration Properties -> General标签。请帮我。
afzalex 2015年

6
那应该是Configuration Properties -> Linker -> General -> Additional Library Directories
Colin Robertson

@afzalex可以在配置属性> VC ++目录>库目录中找到。这是一代人的转变;)
博卡里(Bokhari

缺少第2步的报价。使用:XCOPY "$(SolutionDir)\lib\*.DLL" "$(TargetDir)" /D /K /Y
Tristan CHARBONNIER

@TristanCHARBONNIER有趣。我很确定我XCOPY从工作配置中复制/粘贴了命令。您是在说报价因为对您不起作用而被放错了位置,还是只是猜测?
富p

24

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

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

  2. 手动加载DLL。如果要开发的插件系统中有许多实现公共接口的DLL文件,通常这就是您要执行的操作。有关更多信息,请查阅LoadLibraryGetProcAddress的文档。

对于Qt,我怀疑可能有标头和静态库,您可以在项目中包括并链接这些库。


还有第三种方法,类似于您的第一种方法,使用/MT开关,它将静态链接您的库。优点是没有动态链接开销。但是,如果您还使用/clr开关,则无法使用此功能。
Abel 2014年

2
这仅适用于标准库。对于自定义库(第三方),您不能静态链接dll,除非有人明确构建了可以链接的静态版本。
Laserallan 2014年

@Laserallan我正在开发一个DLL项目,但是当我构建它时,它只是在创建dlllib文件。它不是在创建includes目录。我如何在项目中包含头文件?
MRID

dll / import库是链接器的输出。在提供包含内容时,您需要确保所有内容都一起分发。如何执行此操作取决于您的构建系统,但如果使用cmake,请查看命令的安装系列,这些命令将帮助您以结构化的方式确定要分发的重要文件
Laserallan

6

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

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

而且,您需要通过将相应的.dlls存储在与您相同的文件夹中,或者存储在path上.exe的文件夹中,以在运行时可访问它们。


3

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


回复您的编辑:

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


2

如果您想使用它,那么3rd-party库应该具有* .lib文件和* .dll文件。您只需要在项目的“链接器”选项中将* .lib添加到输入文件列表中即可。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.