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

这篇具有很好参考价值的文章主要介绍了Qt动态调用(外部调用)SDK库(dll动态库)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

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

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

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

一、VS创建dll库

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

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

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

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

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

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

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

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

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

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

 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动态调用(外部调用)SDK库(dll动态库)

 二、使用Qt调用创建的库

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

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

 2、工程如下:

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

 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动态库)

本系列的文章链接如下:

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

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

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

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

C#调用C++封装的SDK库(dll动态库)——下文章来源地址https://www.toymoban.com/news/detail-485675.html

到了这里,关于Qt动态调用(外部调用)SDK库(dll动态库)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python调用动态链接库(DLL)

    Python调用动态链接库(DLL) 动态链接库(Dynamic Link Libraries,简称DLL)是一种被多个程序共享的库文件,可以被用于将程序分解为小模块,减少内存占用,加快程序运行速度。而Python作为一种高级编程语言,可以方便地调用外部的DLL文件。 在Python中,可以使用ctypes模块来调用

    2024年02月13日
    浏览(37)
  • LabVIEW调用动态链接库DLL

    LabVIEW调用动态链接库DLL 要调用DLL,首先必须确定该库是C/ C ++ DLL还是Microsoft .NET Assembly / .NET DLL。 若要确定具有哪种类型的库,可以检查DLL文件的可移植可执行(PE)标头。 DLL 是 C/ C ++ DLL : 1.       如果没有头文件,请查找头文件(* .h)或函数原型定义,请跳

    2024年02月03日
    浏览(28)
  • (三)Qt+OpenCV调用海康工业相机SDK抓拍示例

    提示:这里是该系列文章的所有文章的目录 第一章: (一)Qt+OpenCV调用海康工业相机SDK示例开发 第二章: (二)Qt多线程实现海康工业相机图像实时采集 第三章: (三)Qt+OpenCV调用海康工业相机SDK抓拍示例 在这系列文章中,讲述了Qt下结合OpenCV与海康工业相机的使用,对

    2024年04月08日
    浏览(73)
  • (一)Qt+OpenCV调用海康工业相机SDK示例开发

    提示:这里是该系列文章的所有文章的目录 第一章: (一)Qt+OpenCV调用海康工业相机SDK示例开发 第二章: (二)Qt多线程实现海康工业相机图像实时采集 近期在Qt环境下进行海康工业相机的使用开发,发现海康提供的示例没有Qt的demo,而其中有基于MFC框架的示例,所以在这

    2024年02月03日
    浏览(56)
  • Qt+OpenCV调用海康相机SDK采集图像(C++)

    配置环境: Qt5.12.5 OpenCV3.4.9 海康MVS3.1.0 开发工具:QT Creator-4.11.0 1.1)添加海康的库: 将海康SDK库MVSDevelopmentIncludes和MVSDevelopmentLibrarieswin64下复制到自己的工程目录下 然后把库添加到.pro文件中 点击下一步之后就会在.pro文件中出现如下代码 然后在这后面加上以下代码,添

    2024年02月08日
    浏览(29)
  • C# 运用(codeDom和反射技术)动态编译dll ,动态调用

          在软件运用工程中,往往会根据各种各样,花样百出的需求来设计软件,在最近的项目中无意中,我就遇到了一个需求,据说是,客户要动态编译dll ,我“滴个乖乖”,这是要逆天啊! 话不多说,直接来点干货。 简单分享一下个小demo: 1.运用codeDom技术实现动态程序集

    2024年02月13日
    浏览(26)
  • Java JNA调用dll动态链接库

    记录学习内容 C编译dll环境:         IDE:Clion         ToolChains:MinGW64 Java环境:         版本:jdk1.8 64位         JNA依赖版本:5.2.0 (可根据需要升级,本文以此版本为例) JNA(Java Native Access )提供一组Java工具类用于在运行期间动态访问系统本地库(native library:如W

    2024年02月12日
    浏览(32)
  • 前端(node.js)调用dll动态链接库

    使用 js node 调用dll 动态链接库. github地址如下,包含dll,里面就一个Add方法暴露出来 github Windows 11 22H2 node v16.20.0 Python 3.11.2 需要安装这俩库 ffi-napi app.js 第一种不好使,曲线救国的方式这个是。 python-shell app.js python

    2024年02月16日
    浏览(32)
  • Rust:使用libloader调用动态链接库 (DLL)

    掘金为同人创作:掘金 最近需要使用Rust 动态调用 动态链接库,本来打算是使用 libloading 的,但是 libloading 在调用dll中的函数的时,是必须要在编译时确定参数和return的类型的。但后来发现了 libloader 这个包包, libloader 是基于 libloading 的,但是操作起来却比 libloader 方便。

    2023年04月10日
    浏览(40)
  • Qt6之vc调用qt生成的带ui的dll

    受益于跨平台的特性,Qt生成dll的各种语言调用上体现的淋漓尽致,上篇已经演示了qt生成的无ui的dll及vc如何调用它,本篇将演示vc如何调用qt生成的带ui的dll。 传统观点认为Qt生成的带ui的dll受限于 QApplication 的 exec 方法,这样才能产生消息循环于是只能采用QTWinmigrate中重写

    2024年02月12日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包