Qt 和链接到外部 DLL

Posted

技术标签:

【中文标题】Qt 和链接到外部 DLL【英文标题】:Qt and Linking to an external DLL 【发布时间】:2012-09-19 22:37:38 【问题描述】:

我已经开发了一个程序,我正在尝试使这个程序与其他公司生产的可控光源一起工作。我已经给公司发了电子邮件,他们同意将他们的外部库作为 DLL 发送给我。

我使用 Qt 4.8.1 开发了我的所有软件,并使用 MSVC2008 进行了编译。

可控灯的 DLL 是在 Visual Studio 2008 中编译的,是用 C++ 或 C# 编写的(制造商不确定)。我得到的只是 DLL 和一个文本文件,说我必须:

    添加 DLL 作为对我的项目的引用 将using LightName;添加到类的顶部 像这样实例化对象的一个​​实例:LightName *ln = new LightName(); 使用新创建的 LightName 实例调用函数 void turnOn()。

首先,我觉得奇怪的是外部库需要我实例化他们的对象的一个​​实例,尤其是当它用于一个简单的硬件时。

其次,对方公司没有给我提供接口文件。

我的问题是: 在 Qt 环境中没有接口头文件的情况下,我如何才能链接到 C++ DLL 并公开嵌套在该库中的函数?有没有办法为外部库制作接口?


我已经尝试使用QLibrary 并执行以下操作:

 QLibrary myLib("mylib");
 typedef void (*MyPrototype)();
 MyPrototype myFunction = (MyPrototype) myLib.resolve("mysymbol");
 if (myFunction)
     myFunction();

但是,这不起作用,因为给我的 DLL 不是 C DLL,而且我没有接口,所以 Qt 不知道它需要解析哪些符号。


我尝试使用 dumpbin /EXPORTS 命令显示从我的 DLL 导出的所有定义。不幸的是,这无法产生任何东西。我希望我能从中得到某种被破坏的 C++,然后我可以整理出自己的标题。


我尝试使用dependency walker(非常有用的工具),但是它无法解析任何符号来给我一些函数定义。


【问题讨论】:

我不建议使用 QLibrary 来使用外部库。仅当您事先不知道库的名称时(例如,当您想支持插件时)才需要它。我认为您只需要使用您的 *.pro 文件链接一个库。 是的,这一切都很好,也可以从 .pro 加载库。无论是从 QLibrary 还是从 .pro 加载外部库,我如何才能为用 C++ 编写的 DLL 调用该给定库中的函数? @fasked 他们是否给出了不发送标头的原因? 不,没有理由。不过,它看起来像是必需品。 【参考方案1】:

QLibrary 仅在库具有导出为 C 符号的函数时为您提供帮助。如果那是 C++,您可以转储符号表并查看这对您是否足够。必须对名称进行解构:尝试查找 dumpbin 或类似名称。但是,您可能无法执行此操作,这取决于符号的定义方式。在这种情况下,您必须要求提供标题:read this。

【讨论】:

【参考方案2】:

好吧,要求您“实例化他们的对象的实例”是绝对合法的。让 dll 接口面向对象(与普通的extern "C" 不同)只是他们的设计决定。 QtCore.dll 也只是别人的 DLL,而你一直在实例化他们的对象。

但这也意味着您将很难调用 DLL。这些符号不是“C”符号(你不能那样导出类)所以QLibrary 不能为你做任何事情。您可以尝试从 DLL 中尝试dumpbin /EXPORTS,然后尝试tediously unmangle them 来重构类声明。幸运的是,有一些工具可以帮助您 (even online)

但首先不为此类 DLL 提供头文件是完全愚蠢的。

【讨论】:

嗯,我真的希望用于解开 C++ 代码的网站会有所帮助。不幸的是,当我运行 dumpbin 时,它无法检测到任何加扰或未加扰的方法定义(Screenshot of dumpbin results)。还有其他可能的建议吗?否则,我想我又回到了绘图板上,必须找到新的亮点。我同意,他们无法提供头文件真的很愚蠢。感谢您的帮助@Pavel Zdenek。 我承认对垃圾箱不是很熟悉。这只是每个人都在使用的。所以要 100% 确定,请尝试 Dependency Walker。只需将您的 DLL 放在depends.exe 上,符号(如果有的话)应该会在右上角的第二个窗口中可见。 感谢@Pavel 的建议。不幸的是,我已经尝试过 Dependancy Walker,但它无法解析任何符号。看起来我将不得不向组织发送电子邮件,因为我需要头文件。否则,我可能会选择不同的可控灯,这很不幸。

以上是关于Qt 和链接到外部 DLL的主要内容,如果未能解决你的问题,请参考以下文章

在 Qt 中使用非标准名称链接 lib 文件

在 Windows 中的 Qt 中加载外部 dll

Qt 5.10.1 MinGW .. 如何链接 dll

Qt 非静态链接和 .pro 文件

在 Qt 中使用外部库(libarchive) - 没有 .lib 文件

Qt DLL总结-创建及调用QT的 DLL(三篇)good