13、Qt生成dll-QLibrary方式使用

news2024/10/7 6:47:07

Qt创建dll,使用QLibrary类方式调用dll

一、创建项目

1、新建项目->其他项目->Empty qmake Project->Choose

 2、输入项目名,选择项目位置,下一步

3、选择MinGW,下一步

 4、完成

 5、.pro中添加TEMPLATE = subdirs,并构建项目

 

二、生成dll

1、右击项目,选择新子项目

2、Library->C++库->Choose

3、输入子项目名->下一步

4、下一步

 

5、完成

 8、librarydll.h中声明两个函数,一个可被调用的加法函数,一个不可被调用的减法函数

#ifndef LIBRARYDLL_H
#define LIBRARYDLL_H

#include "librarydll_global.h"

//extern "C" ADDDLLSHARED_EXPORT:使MyAdd函数能被其他程序通过dll调用
extern "C" LIBRARYDLLSHARED_EXPORT int MyAdd(int a, int b);

class LIBRARYDLLSHARED_EXPORT LibraryDll
{

    public:
    LibraryDll();

    //MySub函数不能被其他程序通过dll调用
    int MySub(int a, int b);
};

#endif // LIBRARYDLL_H

 9、librarydll.cpp中对函数进行定义

#include "librarydll.h"

LibraryDll::LibraryDll()
{
}

int LibraryDll::MySub(int a, int b)
{
    return (a - b);
}

int MyAdd(int a, int b)
{
    return(a + b);
}

10、构建LibraryDll项目,在debug文件夹下生成dll

三、使用dll

1、右击项目,选择新子项目

2、Application->Qt Widgets Application->Choose

 3、输入子项目名,下一步

 4、下一步

 5、完成

 6、mainwindow.ui中进行界面设计

 7、mainwindow.h添加代码

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QLibrary>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_addButton_clicked();

    void on_subButton_clicked();

private:
    Ui::MainWindow *ui;

    QLibrary m_lib;
};

#endif // MAINWINDOW_H

 8、mainwindow.cpp添加代码

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //QString str("E:/1.SWS/3.Demo/build-QLibraryDemo-Desktop_Qt_5_12_0_MinGW_64_bit-      Debug/LibraryDll/debug/LibraryDll.dll" );
    QString str("../LibraryDll/debug/LibraryDll.dll" );
    m_lib.setFileName(str);

    //动态加载库
    if(!m_lib.load())
    {
        qDebug() << "load failed:" << m_lib.errorString() ;
    }
}

MainWindow::~MainWindow()
{
    //检查是否加载成功
    if(m_lib.isLoaded())
    {
    //卸载库
    m_lib.unload();
    }
    delete ui;
}

void MainWindow::on_addButton_clicked()
{
    //定义函数指针
    typedef int(*AddFunction)(int a,int b);

    //解析库中的符号
    //AddFunction Add = (AddFunction)lib.resolve("MyAdd");
    AddFunction Add = reinterpret_cast<AddFunction>(m_lib.resolve("MyAdd"));

    if (!Add)
    {
        qDebug() << "resolve failed:" << m_lib.errorString() ;
    }
    else
    {
        int num1 = ui->num1Edit->text().toInt();
        int num2 = ui->num2Edit->text().toInt();

        int ret = Add(num1, num2);
        ui->retEdit->setText(QString::number(ret));
    }
}

void MainWindow::on_subButton_clicked()
{
    //定义函数指针
    typedef int(*SubFunction)(int a,int b);

    //解析库中的符号
    SubFunction Sub = reinterpret_cast<SubFunction>(m_lib.resolve("MySub"));

    if (!Sub)
    {
        qDebug() << "resolve failed:" << m_lib.errorString() ;
    }
    else
    {
        int num1 = ui->num1Edit->text().toInt();
        int num2 = ui->num2Edit->text().toInt();

        int ret = Sub(num1, num2);
        ui->retEdit->setText(QString::number(ret));
    }
}

 9、运行LibraryUse项目

 输入数1、数2,点击“加法”按键

 点击“减法”按键,会输出

resolve failed: "Cannot resolve symbol \"MySub\" in ..\\LibraryDll\\debug\\LibraryDll.dll: 找不到指定的程序。"

原因:MySub函数没有添加extern "C" LIBRARYDLLSHARED_EXPORT声明,不可被调用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/416074.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

定时任务之时间轮算法

初识时间轮 我们先来考虑一个简单的情况&#xff0c;目前有三个任务A、B、C&#xff0c;分别需要在3点钟&#xff0c;4点钟和9点钟执行&#xff0c;可以把时间想象成一个钟表。 如上图中所示&#xff0c;我只需要把任务放到它需要被执行的时刻&#xff0c;然后等着时针转到这个…

IP协议(网络层重点协议)

目录 一、IP协议报头格式 二、地址选择 1、IP地址 &#xff08;1&#xff09;格式 &#xff08;2&#xff09;组成 &#xff08;3&#xff09;分类 &#xff08;4&#xff09;子网掩码 三、路由选择 IP协议是网络层的协议&#xff0c;它主要完成两个方面的任务&#xf…

4.16--设计模式之创建型之代理模式(总复习版本)---脚踏实地,一步一个脚印

1.代理对象 定义&#xff1a;代理模式给某一个对象提供一个代理对象&#xff0c;并由代理对象控制对原对象的引用&#xff0c;从而实现对真实对象的操作。 通俗的来讲代理模式就是我们生活中常见的中介。 在代理模式中&#xff0c;代理对象主要起到一个中介的作用&#xff0c;…

初识Docker并在linux完成安装

文章目录一、 初识Docker1.1 简介1.2 Docker和虚拟机的异同1.3 Docker架构二、 DockerHub三、Docker的安装一、 初识Docker 1.1 简介 Docker是一种开源的容器化平台&#xff0c;可以让开发者在容器中打包、发布、运行和管理应用程序。它使用轻量级的容器来隔离应用程序和它们的…

Scrapy爬虫基本使用与股票数据Scrapy爬虫

Scrapy爬虫的常用命令 scrapy命令行格式 红色是常用的三种命令 为什么Scrapy采用命令行创建和运行爬虫&#xff1f; 命令行&#xff08;不是图形界面&#xff09;更容易自动化&#xff0c;适合脚本控制 本质上&#xff0c;Scrapy是给程序员用的&#xff0c;功能&#xff08…

vue打包之后,可以进行修改配置后端地址、端口等信息方法

前言 用vue-cli构建的项目通常是采用前后端分离的开发模式&#xff0c;也就是前端与后台完全分离&#xff0c;此时就需要将后台接口地址打包进项目中&#xff0c;但是&#xff0c;难道我们只是改个接口地址也要重新打包吗&#xff1f;当然不行了&#xff0c;那就太麻烦了&#…

支付宝沙箱环境+SpringBoot+内网穿透整合开发

目录 1.查看沙箱账号 2.内网穿透 3.沙箱环境整合SpringBoot开发 下面我将以实际案例详细介绍如何使用沙箱环境进行支付宝支付对接的开发 1.查看沙箱账号 首先什么是沙箱账号&#xff1f; 沙箱账号是指在支付宝沙箱环境中创建的测试账户&#xff0c;用于模拟真实的支付流程…

The 2022 ICPC Asia Xian Regional Contest

题目顺序大致按照难度排序。 F. Hotel 现在酒店中有单人间和双人间&#xff0c;价格分别是c1&#xff0c;c2&#xff0c;现在有n个队&#xff0c;每队三个人&#xff0c;性别分别用字母表示&#xff0c;当两个人性别相同且在同一个队时&#xff0c;他们可以住在双人间中。求最…

【跑跑Github开源项目系列】基于YOLO和Streamlit的车辆识别系统demo

【跑跑Github开源项目系列】基于YOLO和Streamlit的车辆识别系统demo写在前面环境配置创建虚拟环境安装库项目运行写在前面 相信很多朋友跟我一样在github等平台上偷代码 (读书人的事怎么能叫偷呢) 的时候会发现伟大且无私的作者虽然开源了代码但是readme文件该写的没写&#x…

2023TYUT移动应用软件开发程序设计和填空

目录 程序设计 程序设计1&#xff1a;根据要求设计UI,补充相应布局文件&#xff0c;即.xml文件 程序设计2&#xff1a;根据要求,补充Activity.java文件 程序填空 说明&#xff1a; 程序设计 程序设计1&#xff1a;根据要求设计UI,补充相应布局文件&#xff0c;即.xml文件…

【C++初阶】第十篇:list模拟实现

文章目录一、list的模拟实现三个类及其成员函数接口总览结点类的模拟实现迭代器类的模拟实现迭代器类的模板参数说明迭代器operator->的重载迭代器模拟实现代码list的模拟实现无参构造函数带参构造拷贝构造函数赋值运算符重载函数析构函数begin和endinserteraselist的迭代器…

WordPress添加阿里云OSS对象云储存配置教程

背景&#xff1a;随着页面文章增多&#xff0c;内置图片存储拖连网站响应速度&#xff0c;这里对我来说主要是想提升速度 目的&#xff1a;使用第三方云存储作为图片外存储(图床)&#xff0c;这样处理可以为服务器节省很多磁盘空间&#xff0c;在网站搬家的时候减少文件迁移的工…

【数据结构】堆(笔记总结)

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;数据结构 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&…

MySQL--数据库基础--0406

目录 1.什么是数据库&#xff1f; 2. 基本使用 2.1 连接服务器 2.2 数据库的操作在Linux中的体现 2.3 使用案例 3.服务器&#xff0c;数据库&#xff0c;表关系 4.数据逻辑存储 5.SQL的分类 6.存储引擎 1.什么是数据库&#xff1f; 数据库和文件 文件或者数据库&…

OK-MX93开发板-实现Web页面无线点灯

上篇文章&#xff1a;i.MX9352——介绍一款多核异构开发板&#xff0c;介绍了OK-MX9352开发板的基础硬件功能。 本篇来使用OK-MX9352开发板&#xff0c;通过Web界面进行点灯测试&#xff0c;最终的效果如下&#xff1a; 在进行代码编写之前&#xff0c;先在Ubuntu虚拟机上把这…

对比损失Contrastive Loss(CVPR 2006)原理解析

paper&#xff1a;http://yann.lecun.com/exdb/publis/pdf/hadsell-chopra-lecun-06.pdf 本文提出的对比损失contrastive loss被广泛应用于自监督模型中&#xff0c;但最初对比损失是作为一个特征降维方法而提出的。 摘要 降维是学习一种映射关系&#xff0c;通过这种映射关…

day10 线程池及gdb调试多线程

目录 线程池的概念 概念&#xff1a; 必要性&#xff1a; 线程池的基本结构&#xff1a; 线程池的实现 完整代码 线程的GDB调试 线程池的概念 概念&#xff1a; 通俗的讲就是一个线程的池子&#xff0c;可以循环的完成任务的一组线程集合&#xff1b; 必要性&#xff…

【软件工程】为什么要选择软件工程专业?

个人主页&#xff1a;【&#x1f60a;个人主页】 文章目录前言软件工程&#x1f4bb;&#x1f4bb;&#x1f4bb;就业岗位&#x1f468;‍&#x1f4bb;&#x1f468;‍&#x1f4bb;&#x1f468;‍&#x1f4bb;就业前景&#x1f6e9;️&#x1f6e9;️&#x1f6e9;️工作环…

趣谈之什么是 API 货币化?

本文介绍了 API 货币化和 APISIX 实现 API 货币化方法。 作者刘维&#xff0c;API7.ai 技术工程师&#xff0c;Apache APISIX Contributor 原文链接 什么是 API 货币化 想象你开发并部署了一个服务&#xff0c;能够搜集你所在城市所有超市的打折和优惠信息&#xff0c;其他的…

C生万物 | 校招热门考点 —— 结构体内存对齐

文章目录一、前言结构体偏移量计算&#xff1a;offsetof二、规则介绍例题的分解与细说三、习题演练1、练习①2、练习②四、为什么存在内存对齐?1、平台原因(移植原因)2、性能原因五、如何修改默认对齐数六、实战演练✍一道百度笔试题&#xff1a; offsetof 宏的实现&#x1f4…