【QT】静态库与动态库
文章目录
- 开始之前
- 一、静态库(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)为扩展名。
使用场景
- 当需要将某些特定代码封装起来但是又不想让其被动态加载
- 在嵌入式系统或者对启动时间和内存占用有严格要求的环境中较为常见
特点
- 永久性: 一旦被链接到可执行文件中,静态库的代码就会成为该程序的一部分。
- 不可重用性:每个使用静态库的应用程序都会包含一份完整的库副本,这可能导致多个应用程序之间存在重复代码。
- 迭代更新:静态库需要重新编译和链接所有依赖于该库的应用程序。
- 程序体积:导致生成的可执行文件较大,因为它包含了所有依赖的库代码。
程序示例
- 创建静态库


staticLibraryDemo 是静态库的库名字,创建路径可根据个人修改,然后直接下一步。

直接下一步,默认即可。(如需选择cmake,可能生成的格式不太一样,没用过,这里仅以qmake为例)

类型:Shared Library、Statically Linked Library、Qt Plugin三种类型,分别表示共享库(动态库)、静态链接库(静态库)、Qt插件,我们这里创建静态库,所以使用Statically Linked Library。
模块:Core、Gui、Widgets三个核心模块,分别表示基础模块(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创建静态库已经完成,生成之后没问题即可。
-
打包发送


使用静态库只需要将上述截图的两个文件,一个Lib和一个.h头文件给到使用项目即可使用,这里需要注意一点:
如果你生成静态库使用了32位的Release,那么你的项目也必须是32位的项目,否则会出现链接错误,根据编译器不同而不同错误呈现方式。 -
测试静态库
新建一个测试项目(这里跳过),然后右键项目选择添加库,出现如下图所示:

选择外部库,然后直接下一步。
新项目目录如上所示,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,动态库是lib,pro文件的区别。

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

导入项目:




然后就可以使用了

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

即通过QLibrary的方式隐式调用:

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

可以看见,pro文件里面通过添加库的方式生成的代码已经屏蔽然后通过QLibrary同样打印了之前的内容,说明是OK的。
相关文章:
【QT】静态库与动态库
文章目录 开始之前一、静态库(static Library)定义使用场景特点程序示例 二、动态库(dynamic Library)定义使用场景特点。程序示例第二种调用 开始之前 测试环境:Qt 5.15.2 Based on Qt 6.4.3(MSVC 2019, x86_64) 操作系统:Windows11 专业版 编程语言&am…...
R的行和列命名和类型的转换
下面内容摘录自: 4章8节:用R做数据重塑,行列命名和数据类型转换-CSDN博客 欢迎订阅我们专栏 一、行和列命名 在数据科学和统计分析中,命名是组织和管理数据的一个重要部分。尤其是在处理复杂的多维数据集时,为行和列命…...
某通用系统0day审计过程
前言 代码审计篇章都是自己跟几个师傅们一起审计的1day或者0day(当然都是小公司较为简单),禁止未经允许进行转载,发布到博客的用意主要是想跟师傅们能够交流下审计的思路,毕竟审计的思路也是有说法的,或者是相互源码共享也OK&…...
windows C++-高级并发和异步(一)
并发和异步的由来已经很久了,对于从xp开始编程的人来说,这个概念并不陌生,但问题在于,在早期,这两个技术被认为是操作系统提供的服务,而非编程语言的概念。 事情发生变化的原因,和C标准不断变迁…...
Java FX 学习
声明:参考视频 一. Stage与Scene 舞台与场景:JavaFX应用程序将Ul容器定义为舞台(Stage)与场景(Scene)Stage类是顶级容器,它对应于窗体,其内容由Scene决定。Scene类是所有可视化内容…...
【走迷宫】
题目 DFS代码 #include<bits/stdc.h> using namespace std; const int N 110; int matrix[N][N]; int n, m; int dx[4] {-1, 0, 1, 0}, dy[4] {0, 1, 0, -1}; int dis[N][N]; void dfs(int x, int y, int cnt) {if(cnt > dis[n-1][m-1]) return;if(x n-1 &&a…...
linux(debian)迁移var数据到已分配逻辑卷的物理盘
文章目录 0 背景1 查看当前情况1.1 查看磁盘空间1.2 列出所有可用块设备的信息,而且还能显示他们之间的依赖关系1.3 查看可用磁盘1.4 查看卷组 2 卷组中创建逻辑卷3 创建文件系统4 创建临时文件夹并挂载,然后备份源文件5 修改开机挂载配置5.1 查看原配置…...
【产品那些事】什么是应用程序安全态势管理(ASPM)?
文章目录 前言当前应用安全(AppSec)推进遇到的问题关于ASPM的定义 为什么需要ASPM:B端客户核心需求ASPM产品关键策略理想状态下的ASPMASPM与CSPM的区别国内外产品参考 前言 随着现代软件开发实践的快速演变,特别是在敏捷开发和 DevOps 的推动下…...
cocosUI多分辨率适配
需求:由于各个设备的分辨率和尺寸并不一样,所以需要一套适配系统去很好的针对不同的设备分辨率或尺寸进行适配,以给玩家一个很好的游戏体验。 目前的主流适配方案 目前,针对不同设备的适配,主流的方案通常包括以下几种…...
无法加载到主类
说明:记录一次项目启动错误,如下: 错误信息:错误: 找不到或无法加载主类 com.hezy.App 原因: java.lang.ClassNotFoundException: com.hezy.App 解决:首先,在项目中勾选这个,显示target文件夹 …...
深入理解Kafka核心设计与实践原理_03
深入理解Kafka核心设计与实践原理_03 03_消费者3.1消费者与消费者组3.2客户端开发3.2.1 必要的参数配置3.2.2 订阅主题与分区 草稿 03_消费者 与生产者对应的是消费者,应用程序可以通过KafkaConsumer来订阅主题,并从订阅的主题中拉取消息。不过在使用Ka…...
MySQL- 覆盖索引
覆盖索引(Covering Index)是 MySQL 中的一种优化技术,它能够显著提高查询性能。在使用覆盖索引的情况下,查询操作只需要访问索引即可获取所需的数据,而不必再访问表的实际数据行(即不需要回表)。…...
JSON与EXL文件互转
功能:实现json到excel文件的相互转换(支持json多选版) 目的:编码与语言对应,方便大家使用 页面设计: 介绍: 1.选择文件栏目选择想要转换的文件 2.生成路径是转换后文件所在目录 3.小方框勾选与不勾选分别代表exl到…...
后台管理权限自定义按钮指令v-hasPermi
第一步:在src下面建立一个自定义指令文件,放自定义指令方法 permission.js文件: /*** v-hasPermi 操作权限处理*/import store from "/store";export default {inserted(el, binding) {const { value } binding;//从仓库里面获取到后台给的数组const permission s…...
【Python绘制散点图并添加趋势线和公式以及相关系数和RMSE】
在Python中,绘制散点图并添加趋势线(通常是线性回归线)、公式、以及相关系数(Pearson Correlation Coefficient)和均方根误差(RMSE)可以通过结合matplotlib用于绘图,numpy用于数学运…...
linux bridge VLAN
TP-Link 支持 Linux 桥接(bridge)和 VLAN 功能的产品主要包括其高端的交换机和一些企业级路由器: TP-Link JetStream 系列交换机: TL-SG3424: 24端口千兆交换机,支持 VLAN 和桥接。TL-SG3210: 24端口千兆管理型交换机&…...
Java进阶篇之深入理解多态的概念与应用
引言 在Java面向对象编程(OOP)中,多态(Polymorphism)是一个关键概念,它允许相同类型的对象在不同的场景中表现出不同的行为。多态不仅增强了代码的灵活性和可扩展性,还极大地提高了代码的可维护…...
Linux下的进程调度队列
我们在进程那一篇讲到了操作系统时间片轮换调度的概念 那么Linux下具体是怎么调度的?...
统计回归与Matlab软件实现上(一元多元线性回归模型)
引言 关于数学建模的基本方法 机理驱动 由于客观事物内部规律的复杂及人们认识程度的限制,无法得到内在因果关系,建立合乎机理规律的数学模型数据驱动 直接从数据出发,找到隐含在数据背后的最佳模型,是数学模型建立的另一大思路…...
【项目】基于Vue3.2+ElementUI Plus+Vite 通用后台管理系统
构建项目 环境配置 全局安装vue脚手架 npm install -g vue/cli-init打开脚手架图形化界面 vue ui创建项目 在图形化界面创建项目根据要求填写项目相关信息选择手动配置勾选配置项目选择配置项目然后我们就搭建完成啦🥳,构建可能需要一点时间࿰…...
一种用于并网光伏系统的创新型多层逆变器,以降低总谐波失真(THD)研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 🎁…...
faah:轻量级自动化任务编排器,简化运维与数据处理工作流
1. 项目概述:一个被低估的自动化利器最近在整理自己的自动化工具链时,又翻出了kiron0/faah这个项目。说实话,第一次看到这个仓库名,我也有点懵——“faah”?这名字听起来不像是一个典型的工具。但点进去之后࿰…...
Arduino nRF52 BLE开发:GATT服务与特征值配置实战详解
1. 项目概述如果你正在用Arduino和nRF52系列芯片(比如nRF52832或nRF52840)做蓝牙低功耗(BLE)开发,那你肯定绕不开GATT(通用属性配置文件)这一关。GATT是BLE通信的“语言规则”,它定义…...
Python Pydantic介绍(数据校验、自动类型转换、结构化数据建模、序列化JSON、配置管理)pydantic-settings、核心BaseModel、字段约束Field()、FastAPI
文章目录Python 数据校验神器:Pydantic 完全指南一、什么是 Pydantic二、Pydantic 能解决什么问题1)数据校验(Validation)2)自动类型转换(Parsing)3)结构化数据建模4)序列…...
基于RAG与智能体技术构建专业客服AI:从知识注入到流程执行
1. 项目概述:一个面向客服场景的AI智能体指南最近在GitHub上看到一个挺有意思的项目,叫mrqhocungdungai-vn/hermes-cskh-guide。从名字就能猜个大概,这是一个关于“Hermes”的客服(CSKH)指南,而且看起来是越…...
React Native聊天UI组件库集成指南:从Sendbird UIKit入门到高级定制
1. 项目概述:一个开箱即用的React Native聊天UI组件库如果你正在用React Native开发一个需要集成聊天功能的App,并且希望这个聊天界面看起来专业、交互流畅,同时你又不想从零开始造轮子,那么你很可能已经听说过或者正在寻找一个合…...
基于Rust的网页正文提取工具web-reader:从原理到自动化实践
1. 项目概述:一个为现代阅读场景而生的开源利器最近在折腾个人知识库和稍后读工具链,发现市面上的网页内容抓取工具要么太重,要么太“脏”——抓下来的内容常常带着一堆广告、导航栏,甚至还有烦人的弹窗代码。直到我遇到了Cat-tj/…...
Step-by-Step知识蒸馏:让小模型学会大模型的推理过程
1. 项目概述:当“小个子”也能学会“大智慧”最近在模型压缩和知识蒸馏的圈子里,一个挺有意思的讨论点又热了起来:我们有没有可能让一个参数规模小得多的模型,通过一种更精细、更“手把手”的教学方式,达到甚至逼近那些…...
CircuitPython串口调试与REPL交互:嵌入式开发的效率倍增器
1. 项目概述:为什么串口交互是嵌入式开发的“生命线”如果你刚开始接触CircuitPython或者任何基于微控制器的嵌入式开发,可能会觉得写代码、上传、看结果这个过程有点“黑盒”。代码上传后,板子默默运行,除了闪烁的LED,…...
中国企业DevOps工具链选型新趋势:本土化与安全合规成为关键决策因素
随着数字化转型进入深水区,中国企业在DevOps工具链选型方面正经历一场深刻的变革。以往单纯关注功能完备性的时代已经过去,如今企业在选择DevOps平台时更加注重本土化适配深度与安全可控能力。通过深入分析国内主流DevOps平台的技术特性和行业应用案例&a…...
