Qt动态调用SDK库(dll动态库)
之前的文章,介绍了Qt调用sdk库的方式,大家可以点击查看(Q调用SDK库(dll动态库))之前的文章,里面介绍的调用方式就是静态的调用方式。如下图所示,需要提供.h文件,dll文件和lib文件。
本篇文章主要实现通过一个dll文件,外部动态调用的方式来调用我们的sdk库。
示例:我们以vs2015创建一个dll库,然后通过Qt MinGW编译器来动态调用这个库。
一、VS创建dll库
1、创建一个dll库的工程,并命名为AddExample。
2、添加一个addExample.h和.cpp文件
3、添加如下头文件和cpp代码
4、注意
我们要注意:一定要添加如下代码,表示要导出函数。
#ifndef DLLEXPORT_EXPORTS
#define DLLEXPORT_API __declspec(dllexport)
#else
#define DLLEXPORT_API __declspec(dllimport)
#endif
同时,EXTERN_C表示防止生成的dll代码在其他编译器使用时可能会被改变。
EXTERN_C DLLEXPORT_API int add(int a, int b);
完整的代码如下:
头文件:
#pragma once
#ifndef DLLEXPORT_EXPORTS
#define DLLEXPORT_API __declspec(dllexport)
#else
#define DLLEXPORT_API __declspec(dllimport)
#endif
#include<iostream>
#include<fstream>
#include<Windows.h>
//函数定义导出接口函数(加、减、乘、除)
EXTERN_C DLLEXPORT_API int add(int a, int b);
EXTERN_C DLLEXPORT_API int subtract(int a, int b);
EXTERN_C DLLEXPORT_API int multiply(int a, int b);
EXTERN_C DLLEXPORT_API int divide(int a, int b);
cpp文件
#include "addExample.h"
int add(int a, int b)
{
return (a + b);
}
int subtract(int a, int b)
{
return (a - b);
}
int multiply(int a, int b)
{
return (a * b);
}
int divide(int a, int b)
{
return (a / b);
}
5、生成
我们可以看到生成的库。
二、使用Qt调用创建的库
1、创建一个Qt的项目,我的编译器如下图所示:
2、工程如下:
3、代码如下:
头文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QLibrary>
#include <QDebug>
namespace Ui {
class MainWindow;
}
typedef int (*_myadd)(int,int);
typedef int (*_mysub)(int,int);
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
//调用dll的resolve功能函数
template<typename Func>
bool resolveFunction(Func& f, const char* name) {
f = (Func)m_pLib->resolve(name); //把名为nanme的功能函数指针传递给对象功能函数f
if (nullptr == f) {
qDebug () << "resolve function " << name << "failed";
return false;
}
qDebug() << "resolve function " << name << "success";
return true;
}
private:
Ui::MainWindow *ui;
QString m_strLibPath; //动态库路径
QLibrary* m_pLib; //指向dll的指针,记得初始化置NULL
_myadd m_myadd; // dll中myadd类型的对象
_mysub m_mysub;
};
#endif // MAINWINDOW_H
cpp文件:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_strLibPath = "F:/My_VsProject/VS2015_project/AddExample/Release/AddExample.dll";
if (!QLibrary::isLibrary(m_strLibPath))
{
qDebug() << m_strLibPath << "!QLibrary::isLibrary";
}
m_pLib = new QLibrary(m_strLibPath);
bool libload =false;
if(!m_pLib->load()) //dll加载
{
qDebug()<<"load failed";
}else
{
qDebug()<<"load succ";
libload =true;
}
if(!resolveFunction(m_myadd, "add"))
{
qDebug()<<"failed";
}else
{
int ret = m_myadd(5,8);
qDebug()<<"ret = "<<ret;
}
}
MainWindow::~MainWindow()
{
delete ui;
}
4、运行查看
运行结果如下:
本系列的文章链接如下:
Qt创建SDK库(dll动态库)并调用SDK库(dll动态库)
SDK(动态链接库dll)的封装技巧
VS2022中创建C++SDK库(dll动态库)并调用SDK库(dll动态库)
C#调用C++封装的SDK库(dll动态库)——上
C#调用C++封装的SDK库(dll动态库)——下