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的主要内容,如果未能解决你的问题,请参考以下文章