在 Qt 中使用第三方 dll(没有可用的 .lib 文件)[重复]

Posted

技术标签:

【中文标题】在 Qt 中使用第三方 dll(没有可用的 .lib 文件)[重复]【英文标题】:Using third party dll in Qt (No .lib file available) [duplicate] 【发布时间】:2014-06-03 13:35:56 【问题描述】:

我的一个朋友让我创建一个应用程序来使用“Velleman VM167”来控制一些东西。这个 VM167 只不过是一个带有一些 GPIO 和一些 ADC 的 USB 接口卡。

此 VM167 带有一个 SDK,包含两个 DLL(VM167.dll 和 MPUSBAPI.dll,其中怀疑第一个 DLL 中使用了另一个)和一个头文件 VM167.h

我之前在 Delphi 中成功使用过该卡,但现在想转换为 Qt。由于这只是一个简单的项目,我认为这可能是正确的时间。

我想要做的是导入 DLL 并使用在该 DLL 中实现的功能。我尝试了很多东西并在谷歌上搜索了很多教程,但他们总是使用.lib.a 文件。我没有。 有没有办法使用这个DLL并使用Qt控制卡?

我使用 Qt 5.3 和 MinGW 32 位编译器。

产品描述和SDK下载链接: http://www.velleman.eu/products/view/?country=be&lang=en&id=384006

【问题讨论】:

【参考方案1】:

由于您使用的是 Qt,因此您可以使用 QLibrary,尤其是它的 resolve 方法。

【讨论】:

【参考方案2】:

在 C/C++ 中使用没有 LIB 文件的 Windows DLL 的方法是通过 LoadLibraryGetProcAddress

在您链接到的 VM167 SDK 中有一些示例,一个在 Examples\VM167DemoBCB_dynamic_load\Unit1.cpp,另一个在 Examples\VM167DemoDevC\main.cpp

【讨论】:

感谢您指出正确的示例!这与 QT 站点上的 Qlibrary 类信息一起让我快速启动并运行。不好的是,我不知道我的代码是做什么的......你能简要解释一下这里发生了什么吗? QLibrary VMDLL("VM167"); typedef int (*VOID2INT)(void); VOID2INT OpenDevices = (VOID2INT) VMDLL.resolve("mysymbol");我的想法是我创建一个带有相应参数的 Typedef,并将结果作为一个类型。然后我创建一个这种类型的实例,然后将它的指针地址设置为 DLL 中实际函数的指针地址。有些正确吗? @Jetse:是的,你已经完全理解了。您需要 typedef 以便编译器知道如何将参数传递给函数,以及期望的返回类型。 QLibrary 完成加载 DLL 并找到所需函数的工作,然后返回指向该函数的指针,然后您通过该指针调用该指针。

以上是关于在 Qt 中使用第三方 dll(没有可用的 .lib 文件)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

QT 中的延迟 DLL 加载

从第三方 DLL 调用 Qt 中的函数在调试模式下工作,在发布时崩溃

Qt Creator开发Android程序 如何调用C语言的dll

将 Qt DLL 保存在单独的文件夹中

Qt windeployqt 导致部署不可用

qt加载第三方sdk的时候,应该将.dll放在哪