我知道我需要使用LoadLibrary()。但是,为了使用第三方DLL文件,我需要采取哪些其他步骤?
我只是跳进了C ++,这是我唯一没有得到的部分(作为Java程序员)。我只是在研究如何使用Qt库和tesseract-ocr,但这个过程对我来说毫无意义,而且谷歌很难。
如何告诉编译器我正在使用的函数?是否应该有来自第三方供应商的包含文件?
答案 0 :(得分:64)
正如其他人所说,LoadLibrary是很难做到的,几乎没有必要。
DLL应该带有一个用于链接的.lib文件,以及一个或多个头文件到#include到你的源代码中。头文件将定义可以从DLL中使用的类和函数原型。即使您使用LoadLibrary,也需要这样做。
要与库链接,您可能必须将.lib文件添加到链接器/输入/附加依赖项下的项目配置中。
答案 1 :(得分:62)
要将第三方DLL合并到我的VS 2008 C ++项目中,我执行了以下操作(您应该可以转换为2010年,2012年等)...
我把头文件和我的其他头文件一起放在我的解决方案中,对我的代码进行了更改以调用DLL的函数(否则我们为什么要这样做呢?)。 :^)然后我更改了构建以将LIB代码链接到我的EXE中,将DLL复制到位,并在我做“干净”时清理它们 - 我在下面解释这些更改。
假设您有2个第三方DLL,A.DLL和B.DLL,并且每个(A.LIB和B.LIB)和头文件(AH和BH)都有一个存根LIB文件。
(您必须为您使用的每个源构建目标(Debug,Release)进行一次下一组更改。)
使您的EXE依赖于LIB文件
A.LIB B.LIB
$(SolutionDir)fodder
,则将其更改为$(SolutionDir)fodder;$(SolutionDir)lib
以添加“lib”。强制将DLL复制到输出目录
XCOPY "$(SolutionDir)"\lib\*.DLL "$(TargetDir)" /D /K /Y
Copy DLLs to Target Directory
No
。
点击OK
。告诉VS在清理输出文件夹时清理DLL:
*.dll
添加到列表末尾,然后点击OK
。答案 2 :(得分:24)
这是在Windows中使用DLL文件的两种方法:
存在一个存根库(.lib),其中包含相关的头文件。当您将可执行文件与lib文件链接时,它将在启动程序时自动加载DLL文件。
手动加载DLL。如果您正在开发一个插件系统,其中有许多DLL文件实现了一个通用接口,这通常是您想要做的。有关详细信息,请查看LoadLibrary和GetProcAddress的文档。
对于Qt,我怀疑有可用的标题和静态库,您可以在项目中包含和链接。
答案 3 :(得分:6)
为了将Qt与动态关联一起使用,您必须在<调整“移民”中指定lib
个文件(通常为qtmaind.lib
,QtCored4.lib
和QtGuid4.lib
。登记/>
Properties » Linker » Input » Additional Dependencies
。
您还必须指定库的路径,即在<
Properties » Linker » General » Additional Library Directories
。
您需要在运行时访问相应的.dll
,方法是将它们存储在与.exe
相同的文件夹中,或者存储在路径的文件夹中强>
答案 4 :(得分:3)
如果要延迟绑定并且仅在运行时解析导入的函数,则只需要使用LoadLibrary。使用第三方dll的最简单方法是链接.lib。
回复您的修改:
是的,第三方API应该包含一个dll和/或一个lib,其中包含声明所需类型的实现和头文件。无论使用哪种方法,您都需要知道类型定义 - 对于LoadLibrary,您需要定义函数指针,因此您可以轻松编写自己的头文件。基本上,如果你想要后期绑定,你只需要使用LoadLibrary。一个有效的原因是,如果您不确定目标PC上是否可以使用该DLL。
答案 5 :(得分:2)
如果你能够使用它,那么第三方库应该有* .lib文件以及* .dll文件。您只需将* .lib添加到项目的“链接器”选项中的输入文件列表中。
这个* .lib文件不一定是'静态'库(包含代码):而* .lib可以只是一个将可执行文件链接到DLL的文件。