新建dll文件
第一步,新建项目文件,选择 Library ---- C++ library
第二步,选择Shared Library,这里Qt Creator默认的是生成一个类,自定义名字为AddFun
第三步,可以看到,Qt生成了两个头文件和一个cpp文件,这里函数的声明主要放在addfun.h中,函数的定义在addfun.cpp文件中。
在addfun.h中声明函数(这里将类注释,是因为封装的dll文件目前不需要类,只需要函数)
#ifndef ADDFUN_H
#define ADDFUN_H
#include "addFun_global.h"
#if 0
class ADDFUN_EXPORT AddFun
{
public:
AddFun();
};
#endif
extern "C" void ReadCamera(int*);
#endif // ADDFUN_H
在cpp文件内对函数ReadCamera定义,同样的,注释掉类的构造函数
#include "addfun.h"
#if 0
AddFun::AddFun()
{
}
#endif
void ReadCamera(int *cameraNum)
{
*cameraNum = 10;
}
最后,运行代码
这里选择取消,可以在生成的文件夹内看到生成的dll文件
Qt对dll文件的显式加载
第一步,将dll文件放在生成exe的文件夹内。
第二步,Qt对dll的显式加载主要使用QLibrary
新建一个testDll项目,验证显式加载dll是否成功。
ui界面如图,当按下按钮,执行加载dll相关函数
在头文件内,定义一个函数指针,用于调用dll文件中的函数。
#include <QWidget>
#include <QLibrary> //显式加载DLL
typedef void (*FUNC)(int *cameraNum);
在cpp文件的按钮槽函数中实现显式调用。
void testDll::on_pushButton_clicked()
{
QLibrary library("addFun.dll");
if(!library.load())
{
ui->ui_displayEdit->setText("error");
return;
}
else
{
int camera=1;
FUNC func = (FUNC)library.resolve("ReadCamera");
if (!func)
{
ui->ui_displayEdit->setText("Resolve function failed!");
return;
}
func(&camera);
QString str=QString::number(camera);
ui->ui_displayEdit->setText(str);
}
}
最终的结果是
说明加载dll内的函数成功。
一些容易出错的注意事项
- library.load()错误
library.load();出错一般是由于没有正确的把dll文件与代码生成的exe文件在同一目录内
- library.resolve()错误
library.resolve(“ReadCamera”);这里出错主要是由于在生成dll文件时,没有使用extern “C”
直接
void ReadCamera(int*);
这样电脑编译生成的dll文件会把函数名称修改,这里不加extern “C”,使用dll分析软件可以看出
ReadCamera变成了_Z10ReadCameraPi,因此resolve会找不到ReadCamera这个函数。
因此,为了防止编译过后,函数名称发生变化,在生成dll的项目中,应加上extern “C”
extern "C" void ReadCamera(int*);