QT导出dll 与 QT调用dll
2011-08-11 15:19
369 查看
这篇内容分两部分:第一部分是 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\
第二部分是 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\
相关文章推荐
- Qt dll的导出与调用
- DLL模块例2:使用__declspec(dllexport)导出函数,extern "C"规范修饰名称,隐式连接调用dll中函数
- 调用未知DLL中的导出函数
- QT编写DLL给外部程序调用,提供VC/C#/C调用示例(含事件)
- QT编写DLL给外部程序调用,提供VC/C#/C调用示例(含事件)
- QT隐式调用VC开发的DLL
- vs下opencv的人脸检测以及qt下dll的封装调用(四、qt下测试dll)
- Qt5.6在vs2013中导出Dll
- VC++编写DLL导出函数及其调用方法
- Qt导出C++类和Qt静态方式加载DLL
- Qt调用dll中的功能函数
- C#调用C++ dll导出函数提示找不到指定模块 by:凉游浅笔深画眉 / Net7Cracker
- native c++/qt中如何调用c#dll
- 如何在QT下调用VC/MFC编写的DLL,分为两种方式。
- QT创建与调用Dll方法
- Win下JNA调用C/C++导出的DLL
- C#与DLL和COM的混合编程(1)-C#调用C++写的非托管的DLL中导出的函数
- Qt调用dll的步骤
- Qt5.9调用dll方法(静态法+dll+头文件)
- vs下opencv的人脸检测以及qt下dll的封装调用(三、vs下测试dll)