Qt动态调用(外部调用)SDK库(dll动态库)

Qt动态调用SDK库(dll动态库)

Qt动态调用(外部调用)SDK库(dll动态库)_第1张图片​​​​​​​

 之前的文章,介绍了Qt调用sdk库的方式,大家可以点击查看(Q调用SDK库(dll动态库))之前的文章,里面介绍的调用方式就是静态的调用方式。如下图所示,需要提供.h文件,dll文件和lib文件。

Qt动态调用(外部调用)SDK库(dll动态库)_第2张图片

 本篇文章主要实现通过一个dll文件,外部动态调用的方式来调用我们的sdk库。

示例:我们以vs2015创建一个dll库,然后通过Qt MinGW编译器来动态调用这个库

一、VS创建dll库

1、创建一个dll库的工程,并命名为AddExample。

Qt动态调用(外部调用)SDK库(dll动态库)_第3张图片

Qt动态调用(外部调用)SDK库(dll动态库)_第4张图片

Qt动态调用(外部调用)SDK库(dll动态库)_第5张图片

Qt动态调用(外部调用)SDK库(dll动态库)_第6张图片

 2、添加一个addExample.h和.cpp文件

Qt动态调用(外部调用)SDK库(dll动态库)_第7张图片

 3、添加如下头文件和cpp代码

Qt动态调用(外部调用)SDK库(dll动态库)_第8张图片

Qt动态调用(外部调用)SDK库(dll动态库)_第9张图片

 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
#include
#include

//函数定义导出接口函数(加、减、乘、除)
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动态调用(外部调用)SDK库(dll动态库)_第10张图片

 二、使用Qt调用创建的库

1、创建一个Qt的项目,我的编译器如下图所示:

Qt动态调用(外部调用)SDK库(dll动态库)_第11张图片

 2、工程如下:

Qt动态调用(外部调用)SDK库(dll动态库)_第12张图片

 3、代码如下:

头文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 
#include 
#include 

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
    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 = "<

4、运行查看

运行结果如下:

本系列的文章链接如下:

Qt创建SDK库(dll动态库)并调用SDK库(dll动态库)

SDK(动态链接库dll)的封装技巧

VS2022中创建C++SDK库(dll动态库)并调用SDK库(dll动态库)

C#调用C++封装的SDK库(dll动态库)——上

C#调用C++封装的SDK库(dll动态库)——下

你可能感兴趣的:(SDK,qt,开发语言,c++)