Qt显式调用C++写的dll + 外一篇

这些天在做一个工程,要用到Qt,所以特别研究了一下Qt显式调用链接库的问题。隐式调用就不那么想用了,个人感觉隐式调用既浪费内存,造成程序启动速度极慢,又容易造成链接错误(本人在ogre中深受链接错误之苦),所以只用了显式调用。以前只试过在MFC中显式调用dll,在Qt上还没试过。其实细细研究一下,相对于MFC的调用来说,Qt的调用也是大同小异的。在这里分享一下。

 首先用VS写一个dll先(名字为QtDllTest)。写dll最大的问题就是解决导出函数重命名问题。其中解决方法是多种多样的。本人只用自己最常用一种——用模块定义文件.def。
 第一步,写一个dll,简单写一个测试加法函数的:
  int add(int a,int b)
  {
       return a+b;
   }
之后添加一个模块定义文件QtDllTest.def:
LIBRARY "QtDllTest"
EXPORTS
add



之后顺利生成dll.
现在可以利用dll函数导出工具DLL Export Viewer查看刚才生成的dll中的导出函数:


发现,导出函数名字没有乱码,说明导出函数正常。
现在,就以这个dll为例来试着用Qt调用。
新建一个名为QtDllTestDemo的Qt Application:

默认,下一步

继续下一步:

Finish就行了。反正一切默认就行。
在ui界面中加入一个pushButton(ObjectName:CalButton,Text:Calculate),一个Label控件(Text:Result),一个lineEdit控件(ObjectName:Result),主要是在点击按钮后调用dll并计算把计算结果显示在文本框中,如下图所示:

为了顺利使用dll,我们要在qtdlltestdemo.cpp开始包含这个东西:#include<QLibrary>
下面给pushButton添加click响应事件:
void QtDllTestDemo::on_CalButton_clicked()
{
 QLibrary lib("QtDllTest.dll");
 if (lib.load())
 {
  typedef int(*AddFunction)(int a,int b);
  AddFunction Add=(AddFunction)lib.resolve("add");
  if (!Add)
  {
   ui.Result->setText("Failed!");
  }
  else
  {
   int m;
   m=Add(1,1); //来个计算1+1
   QString str=QString("%1").arg(m);
   ui.Result->setText(str);
  }
 }
 else
 {
  ui.Result->setText("Failed!");
 }
}
之后生成程序,复制在开始生成的dll文件到QtDllTestDemo的Debug或者Release目录中运行,点击“Calculate"按钮,发现已经成功调用:


其实和MFC的调用也就差那么一两句话,真可谓大同小异。导出类中函数亦如此。

 

如何创建QT使用的DLL(.so)以及如何使用此DLL(.so)
答:创建DLL时其工程使用lib模板
Quote:
TEMPLATE=lib

而源文件则和使用普通的源文件一样,注意把头文件和源文件分开,因为在其它程序使用此DLL时需要此头文件
在使用此DLL时,则在此工程源文件中引入DLL头文件,并在.pro文件中加入下面配置项:
Quote:
LIBS += -Lyourdlllibpath -lyourdlllibname

Windows下和Linux下同样(Windows下生成的DLL文件名为yourdlllibname.dll而在Linux下生成的为libyourdlllibname.so。注意,关于DLL程序的写法,遵从各平台级编译器所定的规则。
展开阅读全文

没有更多推荐了,返回首页