QT导出dll 与 QT调用dll

这篇内容分两部分:第一部分是 QT在 windows 上 DLL的导出和调用;

                                   第二部分是 QT在 linux  上 DLL(os)的导出和调用;

 

 /Windows

1:Windows篇:        在windows上安装 QT+VS2008 ;

  (1)建立导出DLL:

               windows平台上QT开发DLL 与 VC++ 开发DLL 很像,这里重点说明QT开发dll;

                QT的DLL可以用C语言方式写,当DLL生成后,如果是C++调用,包含头文件,注意添加 extern “C”{};

               也可以用C++方式写,这里重点讲解C++方式:

                导出类:

               。打开VS2008建立Qt Library工程,这样就建立了一个简单的 导出类的 DLL工程;

               。在类中添加你的成员函数,成员变量 就可以了,编译生成的dll就导出类了;

              导出函数:

               。如果想导出函数,则在类的头文件中直接编写函数体,且函数前添加导出 extern "C" TQTDLL_EXPORT ( extern "C" 是为了导出函数后的名字不改变);

 

例子:

 //DLL的 头文件;

#ifndef TQTDLL_H
#define TQTDLL_H

#include "tqtdll_global.h"

#include <QMessageBox>

class TQTDLL_EXPORT tQTdll
{
public:
 tQTdll();
 ~tQTdll();

public:
 void show(int i);
 

private:

};


extern "C" TQTDLL_EXPORT void showMessage(int i, int j)
{
 QMessageBox::about(NULL,"dll","void showMessage(int i, int j)");
}


#endif // TQTDLL_H

 

 

//DLL 的CPP文件;

#include "tqtdll.h"

tQTdll::tQTdll()
{

}

tQTdll::~tQTdll()
{

}


void tQTdll::show(int i)
{
 QMessageBox::about(NULL,"dll","void tQTdll::show(int i)");
}

 

 

 

   (2)导入调用DLL:

 

       导入调用类:

      。包含头文件:将DLL中的头文件copy到你的当前工程目录下,简单修改一下,

          TQTDLL_EXPORT 改为 Q_DECL_IMPORT;

         如果有实现的函数体,取消函数体;

      。导入lib文件;

      。声明对象调用,和平常的类使用方式一样;

      导入函数:

      。如果有导入函数:修改头文件,取消函数体,函数前加上extern "C" Q_DECL_IMPORT;

      。定义函数类型指针类型;

      。用下面方式调用DLL中的函数:

        

  QLibrary mylib("tQTdll.dll");   //声明所用到的dll文件


 if (mylib.load())              //判断是否正确加载
 {

  //Fun open=(Fun)mylib.resolve("?showMessage@@YAXHH@Z");    //DLL导出没有添加extern "C" ;

    Fun open=(Fun)mylib.resolve("showMessage");

  if (open)                  //是否成功连接上    {
   open(1,2);      //这里函数指针调用dll中的 

  }
  else
  {
   QMessageBox::information(NULL,"NO","Linke to Function is not OK!!!!");
  }
   
 }
 else
 {
  QMessageBox::information(NULL,"OK","DLL load is NOT OK!");
 }

?

//调用DLL的文件:

#include "ttestqtdll.h"

 

#include <QLibrary>

 
#include "tqtdll.h" //如果是c写的dll或 知道出函数,要用extern "C" , 导出类不可;
 


#pragma comment(lib,"tQTdll.lib")

 
typedef void (*Fun)(int,int); //定义函数指针,以备调用


ttestQTdll::ttestQTdll(QWidget *parent, Qt::WFlags flags)
 : QMainWindow(parent, flags)
{
 ui.setupUi(this);
}

ttestQTdll::~ttestQTdll()
{

}

//class Q_DECL_IMPORT tQTdll ;

void ttestQTdll::on_pushButton_clicked()
{

 //类:

 tQTdll qtdll;

 qtdll.show(0);  //导出类;

 

 //函数:
 
  QLibrary mylib("tQTdll.dll");   //声明所用到的dll文件


 if (mylib.load())              //判断是否正确加载
 {

  //Fun open=(Fun)mylib.resolve("?showMessage@@YAXHH@Z");   

  Fun open=(Fun)mylib.resolve("showMessage");

  if (open)                  //是否成功连接上 

  {
   open(5,6);      //这里函数指针调用dll中的  
  }
  else
  {
   QMessageBox::information(NULL,"NO","Linke to Function is not OK!!!!");
  }
   
 }
 else
 {
  QMessageBox::information(NULL,"OK","DLL load is NOT OK!");
 }

/**/
 

}

 

 

//如果是用Qt Creator创建动态链接库,这里要注意一点,在导入如动态链接库时,配置.pro文件,最简单的方法就是 ,右键,向导;

 

 /Linux (Ubuntu)///

一:导出函数:

1: 在ubuntu 上安装Qt creator,用Qt creator创建C++库,这样就简单的生成来一个动态链接库(或静态链接库),这里将动态链接库的调用方式;

2:上面已经讲解来了 我windows上导出类,这里先讲函数,想屏蔽工程生成的类(包括曾cpp中的实现);

3:可以在h文件中编写想导出的函数,当然也可以在.pp文件中实现,为来简便,都写到.h文件中,函数名前添加 extern "C"  TOSSHARED_EXPORT;

     这样就导出来函数; 

如:导出函数:extern "C" TOSSHARED_EXPORT void showmessage()

                             {

                                     

                             }


二:导入函数;

导入函数在windows上有两种方式,当然里linux上也一样,这里讲解动态调用方式;

1: 声明 #include<QLibrary>;

2:定义 所调用函数的类型: typedef void(*Fun)();

3:将生成的动态链接库文件copy到当前工程目录下;

4:动态调用:

               {

                       QLibrary mylib("./libtos.so");

                      

                        if(  mylib.load() )

                           {

                                     Fun open = (Fun)mylib.resolve("showmessage");

                                      if(open)

                                        {

                                                  open();

                                          }

                                          else

                                           {  QMessageBox(NULL, ""," 函数调用不对 "); }

                            }

                            esle

                           {

                                QMessageBox(NULL,"","动态链接库调用不对");

                            }//最后还要释放,同windwos上很像;

               }


通过以上方式,就可以调用你的动态链接库中的函数来;



 

//导出类,导入类:

1:导出类:

在ubuntu中,导出类,同样可以用Qt Creator向导生成导出;

2:导入类:

。在ubuntu中,导入 动态链接库中的类(函数也可以)有一点麻烦,这里要用到 隐式链接 了;

。同样,ubuntu中的 动态链接库 也是有搜索路径的,默认情况下是  :

    多数库安装在 /usr/lib, 启动库:/lib, 非系统库:/usr/local/lib;  默认程序搜索的是:/lib 和 /usr/lib ;

    所有我们要将 我们的so文件放到其中之一,这里我放到了 /usr/lib 目录下;

    要放置的文件是所有的.so文件:

ubuntu@ubuntu:~$ sudo cp /home/ubuntu/Desktop/tdll-build-desktop/libtdll.so.1.0.0 /usr/lib

ubuntu@ubuntu:~$ sudo cp /home/ubuntu/Desktop/tdll-build-desktop/libtdll.so.1.0 /usr/lib

ubuntu@ubuntu:~$ sudo cp /home/ubuntu/Desktop/tdll-build-desktop/libtdll.so.1 /usr/lib

ubuntu@ubuntu:~$ sudo cp /home/ubuntu/Desktop/tdll-build-desktop/libtdll.so /usr/lib

 

(在我的计算机上还要copy到当调用的工程目录下)

(当然还有很多方法设置路径,具体可以参考网络文章)

。最后就是建立你的应用程序,包含动态库的头文件;

。配置头文件(如下:),这样你就可以调用动态链接库中的类和函数了;

LIBS += ./libtos.so.1.0.0\
./libtos.so.1.0\
./libtos.so.1\
libtos.so\

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chinabinlang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值