1.新建Libary
2.选择共享库
工程如下:
3.编写源码
(1)dll.h文件
#ifndef DLL_H
#define DLL_H
#include "dll_global.h"
#include
#include
using namespace std;
//类
class DLL_EXPORT Dll
{
public:
Dll(); //构造函数
~Dll();
void Print();
string GetStrAdd(string str1, string str2);
};
//非类
extern "C"{
DLL_EXPORT void helloWorld();
DLL_EXPORT int add(int a,int b);
}
#endif // DLL_H
注意:构造dll函数有两种方式:类成员函数和直接函数
直接函数要放在extern "C"{ }中,告诉编译器这些函数名按照C语言格式编译
(2)dll.cpp文件
#include "dll.h"
/*
注意:CMD控制台输出尽量不要使用中文,容易乱码
乱码原因:windows cmd使用的字符集为GBK,CPP文件字符集为UTF-8
*/
Dll::Dll()
{
cout<<"cuanjian dll"<
}
Dll::~Dll()
{
cout<<"xiaohui dll"<
}
void Dll::Print()
{
cout<<"Dll::print hansu"<
}
string Dll::GetStrAdd(string str1, string str2)
{
string s=str1+str2;
cout<<"Dll::GetStrAdd hansu:"<
return s;
}
void helloWorld()
{
cout << "helloworld hansu"<
}
int add(int a, int b)
{
cout<<"add hansu:"<<(a+b)<
return a + b;
}
4.构建dll项目
若使用MinGW编译:编译后会生成dll.dll、libdll.a、dll.o三个文件,.dll是在Windows下使用的,.o是在Linux/Unix下使用的,.a是静态库
使用动态链接库可以很方便地扩展应用程序的功能,但是DLL文件需要随应用程序一起发布,并且编译DLL和应用程序的Qt版本最好保持一致,否则考虑二进制兼容问题
1.创建工程test
2.拷贝有关文件
将dll.h和dll_global.h两个文件放到代码目录中:
3.把动态库dll拷贝到工程目录指定文件夹中
4.在pro工程文件中添加库路径
5.编写源码
(1)win.h文件
#ifndef WIN_H
#define WIN_H
#include
#include
#include "dll.h" //头文件还是需要加的,否则无法解析Dll类
#include
#include
class Win : public QWidget
{
Q_OBJECT
public:
Win(QWidget *parent = nullptr);
~Win();
};
#endif // WIN_H
#include "win.h"
Win::Win(QWidget *parent)
: QWidget(parent)
{
this->resize(300,200);
QLibrary mylib("./mydll/dll.dll"); //创建QLibrary对象
mylib.load(); //加载库
if(mylib.isLoaded()){
//isLoaded 如果库已加载,则返回true;否则返回false
qDebug()<<"DLL已经加载";
//调用类中函数的方法--推荐
Dll* d=new Dll; //创建类对象指针
d->GetStrAdd("abc","ABC");
d->Print();
delete d;
//调用类外函数的方法
typedef void (*fun)(); //声明函数指针数据类型
typedef int(*func)(int,int);
fun hello=(fun)mylib.resolve ("helloWorld");//使hello指向库中指定的非类函数
if(hello){ //如果hello成功指向函数;hello不是nullptr
hello(); //执行函数
}
func Add=(func)mylib.resolve ("add");
if(Add){
int n=Add(10,20);
qDebug()<
}
}
else{
qDebug()<<"dll加载失败";
}
}
Win::~Win()
{
}
以上两个工程下载地址:dll工程下载
1.创建工程
2. 在源码文件夹中建立myh文件夹,把头文件放到该文件夹中
3.在编译文件夹中创建mydll文件夹,把dll动态库放到该文件夹
4.在pro文件中添加库路径
#INCLUDEPATH += D:\bb\yinsi\myh #包含h头文件的文件夹
INCLUDEPATH += .\myh #包含h头文件的文件夹--相对路径
#LIBS += -LD:\bb\build-yinsi-Desktop_Qt_5_15_0_MinGW_32_bit-Debug\mydll -ldll #绝对路径--不推荐
LIBS += -L.\mydll -ldll # 相对路径
#D:\bb\build-yinsi-Desktop_Qt_5_15_0_MinGW_32_bit-Debug\mydll 包含动态库的文件夹
#dll 是动态库文件名
5.导入头文件
#include
6.调用函数
Dll d;
d.Print(); //调用类成员函数
helloWorld(); //调用类外的C格式函数
这种方式调用函数是不是很简单
上面工程下载地址:dll工程下载
本文转载自:https://www.cnblogs.com/liming19680104/protected/p/13797611.html