【QT】静态库与动态库

news2025/2/22 19:51:39

文章目录

      • 开始之前
      • 一、静态库(static Library)
          • 定义
          • 使用场景
          • 特点
          • 程序示例
      • 二、动态库(dynamic Library)
          • 定义
          • 使用场景
          • 特点。
          • 程序示例
          • 第二种调用

开始之前

测试环境:Qt 5.15.2 Based on Qt 6.4.3(MSVC 2019, x86_64)
操作系统:Windows11 专业版
编程语言:C++
__编译器:Qt Creator 11.0.3
本篇文章所有的代码都是在上述的基础上测试通过,此内容应当是通用,不分版本,注明是为了后续定位缺陷,如有瑕疵,劳请指正。

一、静态库(static Library)

定义

静态库是在链接阶段被合并到最终可执行文件中的预编译代码集合。
它通常以.a(Unix/Linux)或.lib(Windows)为扩展名。

使用场景
  • 当需要将某些特定代码封装起来但是又不想让其被动态加载
  • 在嵌入式系统或者对启动时间和内存占用有严格要求的环境中较为常见
特点
  • 永久性: 一旦被链接到可执行文件中,静态库的代码就会成为该程序的一部分。
  • 不可重用性:每个使用静态库的应用程序都会包含一份完整的库副本,这可能导致多个应用程序之间存在重复代码。
  • 迭代更新:静态库需要重新编译和链接所有依赖于该库的应用程序。
  • 程序体积:导致生成的可执行文件较大,因为它包含了所有依赖的库代码。
程序示例
  1. 创建静态库
    在这里插入图片描述
    在这里插入图片描述
    staticLibraryDemo 是静态库的库名字,创建路径可根据个人修改,然后直接下一步。
    在这里插入图片描述
    直接下一步,默认即可。(如需选择cmake,可能生成的格式不太一样,没用过,这里仅以qmake为例)
    在这里插入图片描述
    类型Shared LibraryStatically Linked LibraryQt Plugin三种类型,分别表示共享库(动态库)、静态链接库(静态库)、Qt插件,我们这里创建静态库,所以使用Statically Linked Library。
    模块CoreGuiWidgets三个核心模块,分别表示基础模块(Qt的基础模块,它提供了Qt应用程序所需的非GUI功能)、图形模块(提供了用于创建图形用户界面的基本功能,包括基本的绘图原语、窗口管理、键盘和鼠标事件处理等)、组件模块(提供了用于创建传统的桌面风格的用户界面组件),我们这里选择Core即可。

在这里插入图片描述
这里选择构建组件,MSVC 2019 可在Visual Studio 2019调试,我项目配置的这个配件(根据自己配置选择,可能2015甚至2020,或者没有配置就直接MinGW也可),所以我选择的就是Desktop Qt 5.15.2 MSVC2019 32 和 64位,然后下一步,直至创建成功,生成库项目。

在这里插入图片描述
创建成功后,pro文件里面,我们可以看见如上所述,1表示去掉GUI,2表示生成的是静态库,然后我们就可以为自己的库添加一些接口然后提供给外部使用了。

在这里插入图片描述
1: 默认构造函数不再赘述;
2: 静态对象,提供给外部一个唯一的对象,不过必须将构造函数(默认、有参、拷贝)全部私有化,不然就失去了意义;
3:测试的接口,这里传入两个int然后返回相加的结果,TODO后面省略,自定义接口,实现很简单,考虑完整性,依旧贴上。

在这里插入图片描述

至此,Qt创建静态库已经完成,生成之后没问题即可。

  1. 打包发送
    在这里插入图片描述
    在这里插入图片描述
    使用静态库只需要将上述截图的两个文件,一个Lib和一个.h头文件给到使用项目即可使用,这里需要注意一点:
    如果你生成静态库使用了32位的Release,那么你的项目也必须是32位的项目,否则会出现链接错误,根据编译器不同而不同错误呈现方式。

  2. 测试静态库
    新建一个测试项目(这里跳过),然后右键项目选择添加库,出现如下图所示:
    在这里插入图片描述
    选择外部库,然后直接下一步。

    在这里插入图片描述
    新项目目录如上所示,lib放在根目录,然后新建了一个include文件夹保存库头文件。
    在这里插入图片描述
    1:选择库文件即软件根目录;
    2:选择包含目录,即新建的include目录;
    3:我的测试环境是windows,所以这里我只选择windows;
    4:测试静态库,选择静态;
    5:debug版本添加,我这里是Release版本,所以按需选择即可,我这里主要是勾选解释一下;
    6:直接下一步,Qt会自动在pro文件里面添加对应的库格式,这里不截图跳过。

在这里插入图片描述
库使用即测试接口如上图所示,到此静态库从创建到使用就结束了,大型项目同理。

二、动态库(dynamic Library)

定义

动态库是在运行时被加载的预编译代码集合,在不同的操作系统中,动态库有不同的扩展名:.so(Unix/Linux)、.dll(Windows)或.dylib(macOS)

使用场景
  • 当需要频繁更新代码或希望多个程序共享相同的功能时
  • 在桌面应用和服务器端应用中非常普遍
特点。
  • 可共享性:多个程序可以同时访问同一份动态库,节省内存空间。
  • 迭代更新:如果没有改变接口,只需替换动态库文件即可更新其功能,而无需重新编译和链接使用它的程序。
  • 延迟绑定:函数调用等操作可以在程序运行时进行绑定,而不是在编译时绑定。
  • 程序体积:由于是外部加载的,所以不会增加可执行文件本身的大小。
程序示例

程序相关与静态库相似,唯一不同的就是创建的几个选择,这里我不做讲解,仅贴上创建截图。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
值得一提的是,这里的变化,静态库是staticlib,动态库是libpro文件的区别。

在这里插入图片描述
动态库新增了一个global.h,到时候也要一起放进项目的include(这里只针对我的测试,大家根据自己实际情况添加)

在这里插入图片描述
导入项目

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
然后就可以使用了

在这里插入图片描述

这里再多介绍一种方式,上面是显示加载,在pro里面有添加代码不过是Qt自动添加的,然后在根目录也能找到lib和.h,然后在Release目录能找到dll文件。

第二种调用

在这里插入图片描述
即通过QLibrary的方式隐式调用:

在这里插入图片描述
如上所述:
1、构建QLibrary对象的时候构造函数指定dll路径,然后通过对象的方法load()去加载库,如果返回true表示加载成功,返回false表示加载失败,也可通过unload()函数去卸载库,返回值同load(),然后isLoaded()函数查询库是否有调用成功,再程序运行过程中。

在这里插入图片描述
可以看见,pro文件里面通过添加库的方式生成的代码已经屏蔽然后通过QLibrary同样打印了之前的内容,说明是OK的。

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

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

相关文章

vue打包更新packge.json版本号

VUE项目打包自动更新版本号 此方法只针对 Vue 如果使用其他框架,可以此参照作为参考 一、先看效果 二、创建 buildVersion.js 文件 文件内容 目前只针对3位版本号 递增规则是 每次更新 加一次小版本,10次小版本向前递增一个版本。如:1.0.9 递…

【自用】Python爬虫学习(一):爬虫基础与四个简单案例

Python爬虫学习(一) 基础知识四个简单的爬虫案列1.使用urlopen获取百度首页并保存2.获取某翻译单词翻译候选结果3.获取某网页中的书名与价格4.获取某瓣排名前250的电影名称 基础知识 对于一个网页,浏览器右键可以查看页面源代码,…

通过xshell使用密钥连接阿里云服务器

目录 步骤1:创建密钥对 步骤2:连接服务器 步骤3:连接服务器 连接阿里云服务器有几种方式,例如有密码进行连接,但是密码连接安全风险较大,所以我们选择密钥方式进行连接。操作简单且安全性高 步骤1&…

Element-plus中的el-input无法输入空格和Enter事件无法触发问题

摘要 因为在项目中经常遇到但是又经常忘记是什么原因&#xff0c;记录一下留着自用。 原因&#xff1a;在 el-input 外层包了一层 el-tooltip 导致的。 解决&#xff1a;设置 el-tooltip 的 trigger-keys 属性为空数组&#xff0c;<el-tooltip v-bind"$tooltipConfig&…

【测评】最好用的素材管理软件?3素材管理神器简单对比丨eagle、billfish、千鹿设计助手总有一款适合你

当电脑中的文件堆积如山&#xff0c;寻找特定素材变得耗时费力时&#xff0c;一款优秀的素材管理软件就显得尤为重要。本文将为您介绍三款备受推崇的素材管理工具&#xff1a;Eagle、Billfish和千鹿设计助手&#xff0c;它们各具特色&#xff0c;能有效提升您的工作效率。 今天…

26-原理图的PDF的输出

1. 2.输出完成后&#xff0c;查看

UDP协议与TCP协议的具体区别

在网络通信中&#xff0c;传输层协议扮演着至关重要的角色&#xff0c;它们负责将数据从发送端安全、高效地传输到接收端。UDP&#xff08;用户数据报协议&#xff09;和TCP&#xff08;传输控制协议&#xff09;作为两种最基础的传输层协议&#xff0c;各自在不同的应用场景中…

力扣45:跳跃游戏2题解

题目链接&#xff1a; https://leetcode.cn/problems/jump-game-ii/description/?envTypestudy-plan-v2&envIdtop-100-liked 参考的代码随想录里面的题解&#xff1a; 题目 难度 中等&#xff0c;标的是中等难度&#xff0c;而且我之前做过这道题&#xff0c;但是我没写…

LoRA微调大语言模型Bert

LoRA是一种流行的微调大语言模型的手段&#xff0c;这是因为LoRA仅需在预训练模型需要微调的地方添加旁路矩阵。LoRA 的作者们还提供了一个易于使用的库 loralib&#xff0c;它极大地简化了使用 LoRA 微调模型的过程。这个库允许用户轻松地将 LoRA 层添加到现有的模型架构中&am…

springBoot整合xxl-job开箱即用

一、搭建xxl-job任务调用中心 1. 下载地址&#xff1a; xxl-job: 一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线&#xff0c;开箱即用。 git拉取后&#xff0c;本地打开&#xff0c;并进…

haproxy总结与实验

一、负载均衡 1.1 简述负载均衡 在高并发的业务场景下&#xff0c;解决单个节点压力过大&#xff0c;导致Web服务响应过慢&#xff0c;特别是严重的情况下导致服务瘫痪&#xff0c;无法正常提供服务的问题&#xff0c;而负载均衡的目的就是为了维护系统稳定可靠。负载均衡&…

汽车补光照明实验太阳光模拟器光源

汽车补光照明实验概览 汽车补光照明实验是汽车照明领域的一个重要环节&#xff0c;它涉及到汽车照明系统的性能测试和优化。实验的目的在于确保汽车在各种光照条件下都能提供良好的照明效果&#xff0c;以提高行车安全。实验内容通常包括但不限于灯光的亮度、色温、均匀性、响应…

奥运科技观察:AI PC,如何成为当代体育精神的数字捍卫者?

作者 | 曾响铃 文 | 响铃说 数字孪生帮助体育馆建设、超高清直播……这届奥运会科技感拉满&#xff0c;几乎所有前沿技术都能在奥运的赛事运营中发现。 而AI大时代&#xff0c;AI如何帮助帮助奥运会顺利举办、如何帮助运动员拥有更好的表现&#xff0c;同样值得业界关注&…

洛谷P3919 【模板】可持久化线段树 1(可持久化数组)

目录 tags中文题面思路代码 tags 线段树 主席树 中文题面 如题&#xff0c;你需要维护这样的一个长度为 N 的数组&#xff0c;支持如下几种操作 在某个历史版本上修改某一个位置上的值访问某个历史版本上的某一位置的值此外&#xff0c;每进行一次操作&#xff08;对于操作…

Mybatis PLUS代码生成器generate

Mybatis PLUS代码生成器generate 一、2.3版本二、生成代码三、3.5.1版本四、生成代码 一、2.3版本 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>2.3</version> </dep…

Java 随机生成密码包含大写字母、数字、特殊字符且指定长度

一、写在前面 现在网络环境越来越复杂&#xff0c;对密码安全要求也越来越严格&#xff0c;在生产环境种&#xff0c;对密码要求是一个不少于16位的随机密码&#xff0c;要求含有大写字母、小写字母、数字、特殊字符中的三种。我们使用java代码直接来可控的生成这种密码。 二…

数字县域+乡村振兴解决方案

1. 国家大数据战略与乡村振兴 国家大数据战略的核心内容包括加快建设数字中国&#xff0c;推动数据资源整合和开放共享&#xff0c;以大数据助力产业转型升级和社会治理创新&#xff0c;构建数字经济&#xff0c;提升国家治理现代化水平。 2. 乡村振兴战略的重大意义 乡村振…

【C++】特殊类设计 — 不能被拷贝的类 , 只能在堆/栈上创建对象的类 ,不能被继承的类

苟活者在淡红的血色中&#xff0c;会依稀看见微茫的希望&#xff1b; 真的猛士&#xff0c;将更奋然而前行。 --- 鲁迅 --- toc 1 特殊类 在实践中&#xff0c;常常会有一些比较有意思的特殊场景&#xff1a; 不能被拷贝的类 - 独一无二的魔法宝物&#xff1a; 在一个角色…

『大模型笔记』虚拟机(Virtual Machine,VM)与Docker对比!

『大模型笔记』虚拟机(Virtual Machine,VM)与Docker对比! 文章目录 一. 虚拟机(Virtual Machine,VM)与Docker对比!1. 定义这两种技术2. 工作原理3. 关于如何选择适合工作负载的技术的指导二. 参考文献Docker 只是一个轻量级的虚拟机吗?虽然二者确实有一个共同点,即 虚…

【RISC-V设计-13】- RISC-V处理器设计K0A之指令测试

【RISC-V设计-13】- RISC-V处理器设计K0A之指令测试 文章目录 【RISC-V设计-13】- RISC-V处理器设计K0A之指令测试1.简介2.验证用例3.指令代码4.链接脚本5.编译脚本6.仿真结果6.1 复位结束6.2 运行成功6.3 终端打印 7.总结 1.简介 借助上一篇文章所提及的验证环境&#xff0c;…