如何在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)进行一次更改。)
-
让您的EXE依赖于LIB文件
- 转到configuration属性 – >链接器 – >input – >其他依赖项,并列出你的.LIB文件,每次一个,用空格分隔:
A.LIB B.LIB
- 转到configuration属性 – >常规 – >其他库目录,并将您的“lib”目录添加到您已经在那里。 条目以分号分隔 。 例如,如果您已经有
$(SolutionDir)fodder
,则将其更改为$(SolutionDir)fodder;$(SolutionDir)lib
以添加“lib”。
- 转到configuration属性 – >链接器 – >input – >其他依赖项,并列出你的.LIB文件,每次一个,用空格分隔:
-
强制将DLL复制到输出目录
- 转到configuration属性 – >生成事件 – >生成后事件
- 把下面的命令行(对于开关意义,请参阅DOS窗口中的“XCOPY /?”):
XCOPY "$(SolutionDir)"\lib\*.DLL "$(TargetDir)" /D /K /Y
- 你可以把这样的东西描述:
Copy DLLs to Target Directory
- 排除从生成应该是
No
。 点击OK
。
-
告诉VS在清理输出文件夹时清理DLL:
- 转到configuration属性 – >常规 – >扩展删除干净,然后单击“…”; 将
*.dll
添加到列表的末尾,然后单击OK
。
- 转到configuration属性 – >常规 – >扩展删除干净,然后单击“…”; 将
这些是在Windows中使用DLL文件的两种方法:
-
有一个存根库(.lib)和相关的头文件。 当您将可执行文件链接到lib文件时,它将在启动程序时自动加载DLL文件。
-
手动加载DLL。 如果您正在开发一个插件系统,其中有许多DLL文件实现一个通用接口,那么这通常是您想要做的。 查看LoadLibrary和GetProcAddress的文档以获取更多信息。
对于Qt我会怀疑有标题和一个静态库可用,你可以包括和链接到你的项目。
为了在dynamic链接中使用Qt,你必须指定lib
文件(通常是QtCored4.lib
, QtCored4.lib
和QtGuid4.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的文件。