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

news2024/12/25 12:16:02

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

一、项目场景

在日常的项目中,我们经常会遇到调用别人的数学库、线程库、图形库等操作。这些库通常就被称为SDK,SDK全称是Software Development Kit(软件开发工具包),是软件开发中用到的开发工具集合。

SDK通常就是封装为单一功能的功能库,比如语音识别SDK。

 很早之前,API的集合也被称之为SDK。

在windows系统中,DLL库提供了API函数的声明和导入库(.lib),而SDK也是提供windows下程序开发所需的文件和工具的“工具包”,SDK包含了使用API所需的资料,所以通常也罢使用API编程来编写windows应用程序的开发方式叫做SDK编程。

二、静态链接库和动态链接库

静态链接库和动态链接库的区别,主要是依照调用方式来区分的,即静态链接和动态连接:

  • 静态连接:指在创建应用程序的时候,将库集成进去,这样做的好处就是应用程序包自身可以独立运行,而不好的地方就是包会略显臃肿,库不能共享(静态库,windows 下以 .lib 结尾、linux 下以 .a 结尾);
  • 动态连接:创建应用的时候只约定好与库之间的调用关系,而不彻底将库包集成进应用。这样在应用运行时,需要运行环境中提供库,并且连接装载。但由于本身不集成库内容,会比较小,同时也为和其他应用共享库的使用提供了可能(动态库是windows 下以 .dll 结尾、linux 下以 .so 结尾)。

1、静态库

静态库链接时会被完整的复制到可执行文件中,所以如果两个程序都用了某个静态库,那么每个二进制可执行文件里面,都会含有这份静态库的代码;

2、动态库

动态库链接时不复制,而是在程序启动后动态加载,然后再进行符号决议(符号绑定)。理论上动态库只存在一份就可以了。其他的程序都可以动态链接到这个动态库上面,从而节省内存(内存中只有一份动态库)。另外一个好处是,由于动态库并不绑定到可执行程序上,所以我们想升级这个动态库就很容易,windows和linux上面一般插件和模块机制都是这样实现的。

3、优缺点对比

静态库动态库
优点1. 目标程序没有外部依赖,直接就可以运行。2. 效率较动态库高。1. 不需要拷贝到目标程序中,不会影响目标程序的体积。2. 同一份库可以被多个程序使用(因为这个原因,动态库也被称作共享库)。3. 编译时才载入的特性,也可以让我们随时对库进行替换,而不需要重新编译代码。实现动态更新
缺点1. 会使用目标程序的体积增大。1. 动态载入会带来一部分性能损失(可以忽略不计)2. 动态库也会使得程序依赖于外部环境。如果环境缺少动态库或者库的版本不正确,就会导致程序无法运行(Linux lib not found 错误)。

三、Qt下动态库的创建

1、打开Qt Creator,点击“新建文件或项目”

选择一个模板,“Library”->C++库->"Choose..."

 类型选择“共享库”,名称中输入exampleDLL,

 Kits选择:

可以看到创建的项目:

我们在exampledll.h头文件编写示例代码:

#ifndef EXAMPLEDLL_H
#define EXAMPLEDLL_H

#include "exampledll_global.h"

class EXAMPLEDLLSHARED_EXPORT ExampleDLL
{

public:
    ExampleDLL();

    int add(int a, int b);

    int subtract(int a, int b);

    int multiply(int a, int b);

    int divide(int a, int b);
};

#endif // EXAMPLEDLL_H

在exampledll.cpp文件中编写实现代码:

#include "exampledll.h"


ExampleDLL::ExampleDLL()
{
}

int ExampleDLL::add(int a, int b)
{
    return ( a + b );
}

int ExampleDLL::subtract(int a, int b)
{
    return ( a - b );
}

int ExampleDLL::multiply(int a, int b)
{
    return ( a * b );
}

int ExampleDLL::divide(int a, int b)
{
    return ( a / b );
}

release模式下,编译成功后,可以在release文件夹下面看到生成的exampleDLL.dll和exampleDLL.lib,至此,动态库编译就结束了,下面我们开始调用。

四、Qt下动态库的调用

通过上面的一步,我们完成了动态库的创建,现在我们开始调用创建的动态库。

1、使用Qt Creator创建一个控制台程序,callExampleDLL。

2、把上面编译后的exampleDLL.dll拷贝到callExampleDLL工程release文件夹下

 3、把上面编译后的exampleDLL.lib和exampledll.h、exampledll_global.h。拷贝到callExampleDLL工程目录下:

 4、在callExampleDLL项目中把exampledll.h、exampledll_global.h头文件添加进来:

5、在pro文件中添加:

LIBS += -L$$PWD -lexampleDLL

在代码中需要包含要调用的头文件。

具体的调用代码如下所示:

#include <QCoreApplication>
#include <QDebug>
#include "exampledll.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    ExampleDLL example;
    int a1 = 10;
    int b1 = 5;

    qDebug()<<"test call dll.";

    qDebug()<<"a1 + b1 = "<<example.add(a1,b1);
    qDebug()<<"a1 - b1 = "<<example.subtract(a1,b1);
    qDebug()<<"a1 * b1 = "<<example.multiply(a1,b1);
    qDebug()<<"a1 / b1 = "<<example.divide(a1,b1);

    return a.exec();
}

五、demo运行结果

我们看下调用的效果:

上一篇:

下一篇:

本文原创作者:冯一川(ifeng12358@163.com),未经作者授权同意,请勿转载。

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

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

相关文章

【C++ 五】结构体

结构体 文章目录 结构体前言1 结构体基本概念2 结构体定义和使用3 结构体数组4 结构体指针5 结构体嵌套结构体6 结构体做函数参数7 结构体中 const 使用场景8 结构体案例8.1 案例一8.2 案例二 总结 前言 本文包含结构体基本概念、结构体定义和使用、结构体数组、结构体指针、结…

gitlab CI CD基础概念

gitlab CI CD基础概念 本文目录 gitlab CI CD基础概念基础概念Pipelines&#xff1a;流水线JobsStage .gitlab-ci.yml使用模式1&#xff1a;官网gitlab 本地gitlab runner使用模式2&#xff1a;docker gitlab docker gitlab runner 基础概念 开发模式转变&#xff1a;瀑布模…

【MySQL】(5)聚合函数

文章目录 聚合函数COUNT 函数SUM 函数AVG 函数MAX 函数 MIN 函数 group by 子句简介示例&#xff1a;scott 数据库单列分组多列分组 having 子句总结 聚合函数 在 MySQL 中&#xff0c;聚合函数是用于计算多行数据的统计信息的函数&#xff0c;例如总和、平均值、最大值、最小…

图扑数字孪生工厂合集 | 智慧工厂可视化,推动行业数字化转型

前言 图扑软件基于 HTML5&#xff08;Canvas/WebGL/WebVR&#xff09;标准的 Web 技术&#xff0c;满足了工业物联网跨平台云端化部署实施的需求&#xff0c;以低代码的形式自由构建三维数字孪生、大屏可视化、工业组态等等。从 SDK 组件库&#xff0c;到 2D 和 3D 编辑&#…

LeetCode算法小抄--花式遍历二叉树

LeetCode算法小抄--花式遍历二叉树花式遍历二叉树翻转二叉树[226. 翻转二叉树](https://leetcode.cn/problems/invert-binary-tree/)填充节点的右侧指针[116. 填充每个节点的下一个右侧节点指针](https://leetcode.cn/problems/populating-next-right-pointers-in-each-node/)将…

OpenCV实例(一)人脸检测

OpenCV实例&#xff08;一&#xff09;人脸检测 1.人脸检测和识别概述2.使用OpenCV进行人脸检测2.1静态图像中的人脸检测2.2视频中的人脸检测 作者&#xff1a;Xiou 1.人脸检测和识别概述 计算机视觉使很多任务成为现实&#xff0c;其中两项任务就是人脸检测&#xff08;在图…

psql Centos7安装postgresql-12

之前在centos7上下的postgresql&#xff0c;它的数据库实例在 “var/lib/pgsql/” 下。这就导致了系统用户的"postgres"的家目录跟postgresql数据库目录不在同一目录下。因此&#xff0c;今天趁着有闲暇时间把数据库装到"postgres"目录下&#xff0c;顺便把…

罗丹明荧光染料标记叶酸,FA-PEG2000-RB,叶酸-聚乙二醇-罗丹明; Folic acid-PEG-RB

FA-PEG-RB,叶酸-聚乙二醇-罗丹明 中文名称&#xff1a;叶酸-聚乙二醇-罗丹明 英文名称&#xff1a;FA-PEG-RB, Folic acid-PEG-RB 性状&#xff1a;粉红色固体或液体&#xff0c;取决于分子量 溶剂&#xff1a;溶于水和DMSO、DMF等常规性有机溶剂 保存条件&#xff1a;-2…

学习系统编程No.17【vscode实战】

引言&#xff1a; 北京时间&#xff1a;2023/4/11/7:25&#xff0c;昨天11点洗澡&#xff0c;洗完直接睡&#xff0c;导致现在头发愈发不能看&#xff0c;So&#xff0c;平头时刻将要来临&#xff0c;头发太长真的很不方便&#xff0c;昨天已经更文啦&#xff01;这个星期一定…

miss_01(简单密码学及音频隐写)

下载附件&#xff0c;解压时提示输入密码 使用010editor打开&#xff0c;发现deFlags值被修改 &#xff08;如果frFlags 或者 deFlags 的值不为0就会导致zip的伪加密&#xff09; 将deFlags的值修改为0&#xff0c;并将文件另存为1.zip 再次打开&#xff0c;没有密码提示了 打…

酒吧攻略:一文解读酒吧类型

目前主流酒吧类型可以大致分为以下几类&#xff1a; 夜店&#xff1a;&#xff08;NIGHT CLUB&#xff09;&#xff1a;KTV&#xff0c;夜总会&#xff0c;酒吧等总称club&#xff0c;主要指的就是夜店。 Bar&#xff1a;多指娱乐休闲类的酒吧&#xff0c;提供现场的乐队或歌…

UG导出点集坐标到txt文本文档中

文章目录 前言一、下载文件二、使用步骤1.运行Grip程序2.选择下载的points-file.grx文件3.选择要导出的文本文档的位置4.选择想要导出的点集5.查看文件 参考 前言 将UG中的离散的点或者点集坐标导出到文本文档&#xff1b; 原文地址 俩文件链接如下&#xff0c;失效了可以私信…

客快物流大数据项目(一百一十四):负载均衡 Spring Cloud Ribbon

文章目录 负载均衡 Spring Cloud Ribbon 一、Ribbon 简介 二、负载均衡源码跟踪探究 负载均衡 Spring Cloud Ribbon 为了增加服务并发访问量,我们搭建集群,集群的负载均衡怎么实现?

OpenAI-ChatGPT最新官方接口《速率并发限制》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(八)(附源码)

Rate limits 速率并发限制前言Introduction 导言What are rate limits? 什么是速率限制&#xff1f;Why do we have rate limits? 为什么我们有速率限制&#xff1f;What are the rate limits for our API? 我们API的速率限制是什么&#xff1f;GPT-4 rate limits GPT-4速率…

【JavaEE】Spring + IoC + DI

目录 Spring概念 IoC DI Spring概念 Spring是包含众多工具方法的IoC容器。 IoC IoC&#xff1a;Inversion of Control 控制权反转 它是一种思想&#xff0c;是面向对象的一种设计原则。这种思想为了实现类与类之间的解耦。 比如当一个对象要使用另一个对象时&#xff0c;不再…

IO流相关知识

IO流 1.文件 保存数据的地方 2.文件流 文件在程序中以流的形式来操作的 流&#xff1a;数据在数据源&#xff08;文件&#xff09;和程序&#xff08;内存&#xff09;之间的经历的路程 输入流&#xff1a;数据从数据源&#xff08;文件&#xff09;到程序&#xff08;内存…

【FPGA-DSP】第五期:FFT调用流程

目录 1. matlab输入信号编写 2. Simulink开发 2.1 模块搭建 2.2 Simulink运行 2.3 matlab信号处理 拓&#xff1a;输入信号位数改变 本章节主要说明如何在system generator中使用fft模块&#xff0c;话不多说&#xff0c;看操作&#xff1a; 参考教程第5期 - FFT调用流…

PyQt PyQt5 Python VTK Gui Actor 选中 高亮显示 actor

前言&#xff1a; 本文主要介绍了如何使用Python VTK高亮显示actor&#xff0c;使用Python语言&#xff0c;高亮显示选中的actor。当窗口中的圆球actor被选中时&#xff0c;会变成红色&#xff0c;并且会显示actor三遍面片边缘信息。 效果&#xff1a; VTK VTK&#xff0c;&…

Linux常见实用操作汇总(带示例版)

Linux常见实用操作汇总 1、各类快捷键1.1 强制停止1.2 退出、登出1.3 历史命令搜索1.4 光标移动1.5 清屏 2、软件安装2.1 在CentOS系统中&#xff0c;使用yum命令联网管理软件安装2.2 在Ubuntu系统中&#xff0c;使用apt命令联网管理软件安装。 3、systemctl4、软连接5、日期和…

Golang每日一练(leetDay0036) 二叉树专题(5)

目录 106. 从中序与后序遍历序列构造二叉树 Construct-binary-tree-from-inorder-and-postorder-traversal &#x1f31f;&#x1f31f; 107. 二叉树的层序遍历 II Binary Tree Level-order Traversal II &#x1f31f;&#x1f31f; 108. 将有序数组转换为二叉搜索树 C…