【发布时间】: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
-
他们是否给出了不发送标头的原因?
-
不,没有理由。不过,它看起来像是必需品。
标签: qt dll dynamic-linking qlibrary