Qt和链接到外部DLL

时间:2012-09-19 22:37:38

标签: qt dll dynamic-linking qlibrary

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

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

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

  1. 添加DLL作为对项目的引用
  2. using LightName;添加到班级
  3. 的顶部
  4. 实例化对象的实例,如下所示:LightName *ln = new LightName();
  5. 使用新创建的LightName实例调用函数void turnOn()。
  6. 首先,我发现奇怪的是外部库要求我实例化其对象的实例,特别是当它用于简单的硬件时。

    其次,另一家公司没有为我提供界面文件。

    我的问题是: 如何在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(非常有用的工具),但它无法解析任何符号以给我一些函数定义。


2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

要求你“实例化他们的对象实例”是绝对合法的。简单地说,他们的设计决定是使dll接口面向对象(与普通extern "C"相反)。 QtCore.dll也只是别人的DLL,而且你一直在实例化它们的对象。

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

但是,首先没有为这样的DLL提供头文件是完全愚蠢的。