Qt新建动态链接库及显式加载

新建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内的函数成功。

一些容易出错的注意事项

  1. library.load()错误

library.load();出错一般是由于没有正确的把dll文件与代码生成的exe文件在同一目录内

  1. 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*);

猜你喜欢

转载自blog.csdn.net/qq_43376782/article/details/124416326