Qt之将源代码封装成库文件使用(五)

Qt开发 系列文章 - Code-To-Library(五)


目录

前言

一、库文件

二、直接封装方式

1.静态库封装

2.动态库封装

3.其它库类型

三、二次重写封装

四、库的使用

1.移植库及头文件

2.添加外部库

总结


前言

库文件是计算机上的一类文件,可以把库文件看成一种代码仓库,它提供给使用者一些可以直接拿来用的变量、函数或类。在Qt中将源码封装成库文件,通常指的是创建一个动态链接库(.dll)或静态库(.lib/.a),供其他程序使用。


一、库文件

库文件是计算机上的一类文件,提供给使用者一些开箱即用的变量、函数或类。库文件分为静态库和动态库,静态库和动态库的区别体现在程序的链接阶段:静态库在程序的链接阶段被复制到了程序中;动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用。库文件_百度百科 (baidu.com)

下面将讲解两种Qt封装库方式,第一种直接封装,利用Qt生成的空项目,将源文件添加进去,此封装简单、使用方便,比较推荐;第二种二次重写封装,利用Qt生成的项目(带用户层),将源文件添加进去,是基于用户层封装,即对库里面的函数可二次改写封装,更好的供用户使用。

二、直接封装方式

1.静态库封装

  • 步骤一

打开Qt软件,在左上角文件处,选择创建一个Qt项目,如下所示。然后在模板上选择其他项目中的一个Empty qmake Project项,点击完成创建。提示:在这为啥不选择Library模版了,第一这种方式使用更为简洁和方便;第二本文后面会采用这种方式,但是使用在二次封装上更为合适。

  • 步骤二

创建你的项目名称和保存路径,如下所示。

  • 步骤三

选择Qt自带的MinGW 32位编译器(当然你也可以选择其它的编译器),如下所示。

  • 步骤四

点击下一步,如下所示。

  • 步骤五

最后会创建一个只带pro文件的空项目,如下所示。

  • 步骤六

找到创建项目目录下面,只有如下两个文件,如下左图所示。这时,我们需要将封装成库文件的源代码文件(示例为一个源文件和头文件,实际使用可能有多个)拷贝到里面,如下右图所示。

  • 步骤七

在Qt中打开pro项目文件,需要在空白的pro文件上面添加如下代码,如下所示。具体解释也在代码注释行中,比较详细了。

#使用的是绘图插件需用到如下
QT += core
QT += gui
#版本比较,特殊处理
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport
#库文件版本定义
#VERSION = 2.1.0
#生成库文件名称定义
TARGET = qcustomplot
#生成库文件定义
TEMPLATE = lib
#全局宏定义
#DEFINES += QCUSTOMPLOT_LIBRARY
#DEFINES += QCUSTOMPLOT_COMPILE_LIBRARY
#生成为静态库设置
CONFIG += staticlib
#生成为动态库设置
#CONFIG += dll
CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    qcustomplot.cpp

HEADERS += \
    qcustomplot.h

上述代码中,将源代码库版本注释掉,如果不注释的话,会在生成的.a库文件名称后缀加上2,需注意一下。还需要注意一点生成库文件名称的定义 TARGET = qcustomplot ,如果不使用这个,编译完后你生成的静态库文件,默认以你项目名称命名的。

  • 步骤八

在Qt项目界面的左下角,将debug模式更改为release模式,如下左图所示。然后点击界面左侧的项目选项,在构建目录处修改你编译生成的目录文件,当然也包括你生成的库文件,如下右图所示。

  • 步骤九

上述步骤都完成了,然后点击编译,编译完后,会看到添加的源代码库文件和该项目目录下生成的编译文件,如下图所示。

         

  • 步骤十

打开上述目录下的release文件夹,看到libqcustomplot.a文件就是你所需要的静态库文件,如下图所示。

至此,已经将利用Qt将源码封装成静态库文件讲解完毕,可以在Qt项目中添加并使用它。

2.动态库封装

动态代码封装在上述静态封装讲解中有提到过,即将步骤七中的pro文件,将CONFIG 添加为staticlib修改为dll即可,具体代码如下,其它的代码不变。

#生成为静态库设置
#CONFIG += staticlib
#生成为动态库设置
CONFIG += dll

修改完后编译运行,同上在release文件夹中找到封装好的库文件如下,图中红圈处。可以在Qt项目中添加并使用它。

3.其它库类型

上述两小节演示,只是在release模式和32位编译器模式下操作的,使用时自然也只能在对应的模式下运行,如果说需要在debug或者64位编译器下运行,需进行如下修改。

  • debug模式

如下图所示,在Qt项目界面左下角,可以选择编译模式,然后输出即为对应的库文件。

  • 64bit模式

如下图所示,在Qt项目界面中间偏左位置,点击项目,然后可以选择你需要的编译器和编译位数,修改完后编译运行,即输出对应的库文件。

三、二次重写封装

在上一章节,直接封装方式的步骤一,创建一个Qt项目,在模板上不选择Empty qmake Project项,选择Library模版,如下所示。

然后创建步骤跟上面类似,到第五步时,需要生成如下文件,不像上面只生成一个空的pro文件。

点击创建项目,打开pro文件,在里面添加如下代码。这里是以三方插件库log4qt示例(带pri子工程的),如果是上面的qcustomplot示例,则不需要加这句话,只需要将库源代码添加到工程即可。为什么以log4qt示例,因为这个一般用户常会重写为自己使用的函数,而qcustomplot就没必要比较成熟了。

include(../log4qt/log4qt.pri)

然后在你创建的用户类上改写自己需要用或者习惯用的功能。例如:改写debug、info等等函数习惯,如下。

头文件里用户类改写

相关函数重写。

#include "test_log4qt.h"
/******************************************************************************
** 函数名称:    debug
** 函数功能:    记录日志信息,日志等级:debug
** 输   入:    日志内容
** 输   出:    (无)
** 修改记录:
******************************************************************************/
void Test_log4qt::debug(const QString &msg)
{
    m_customDebug->debug(msg);
}

/******************************************************************************
** 函数名称:    info
** 函数功能:    记录日志信息,日志等级:info
** 输   入:    日志内容
** 输   出:    (无)
** 修改记录:
******************************************************************************/
void Test_log4qt::info(const QString &msg)
{
    m_customInfo->info(msg);
}

/******************************************************************************
** 函数名称:    warn
** 函数功能:    记录日志信息,日志等级:warn
** 输   入:    日志内容
** 输   出:    (无)
** 修改记录:
******************************************************************************/
void Test_log4qt::warn(const QString &msg)
{
    m_customWarn->warn(msg);
}

/******************************************************************************
** 函数名称:    error
** 函数功能:    记录日志信息,日志等级:error
** 输   入:    日志内容
** 输   出:    (无)
** 修改记录:
******************************************************************************/
void Test_log4qt::error(const QString &msg)
{
    m_customError->error(msg);
}
/******************************************************************************
** 函数名称:    fatal
** 函数功能:    记录日志信息,日志等级:fatal
** 输   入:    日志内容
** 输   出:    (无)
** 修改记录:
******************************************************************************/
void Test_log4qt::fatal(const QString &msg)
{
    m_customFatal->fatal(msg);
}

没有错误后,编译运行,会在本目录release文件夹下生成对应的库文件,如下所示。

至此,本章节讲解完毕,关于生成静态库方式、以及其它库类型的方式跟上一章节操作一样的,就没必要说明了。相应的示例在文末链接。

四、库的使用

对库的使用,一般是指你的项目添加第三方库文件(也就是外部库),然后在使用它。

所以要使用外部库,一般分为两步,移植库相关文件和添加库相关文件。

1.移植库及头文件

首先打开你的项目文件目录,将库文件及头文件复制添加进来,如下图所示。在新创建的test项目中添加qcustomplot文件夹,里面包含有qcustomplot的库文件和头文件,如下图。

  

2.添加外部库

添加外部库有两种方式。

第一种直接手鲁,在你的pro文件中加入如下代码。

INCLUDEPATH += $$PWD/QCustomplot
win32: LIBS += -L$$PWD/QCustomplot/ -lqcustomplot

第二种利用Qt添加,在Qt中右键你的项目,选择添加库,然后选择外部库,如下所示。

上述下一步后,添加对应的库文件和头文件包含目录,如下所示。

修改完后下一步,生成如下代码。

至此,外部库在项目中的添加讲解完毕,尽情在项目中使用它吧。


总结

本文讲解并演示了Qt将源码打包成库文件的方式,并可以生成静态、或动态、以及debug或release模式、32bit或64bit模式的库文件,并以不同的方式进行实现,比较清晰。最后在讲解下如何在你的项目中使用它。

博文中相应的工程代码Qt-Case.zip 利用Qt开发软件进行编的例程,为博文提供案例-CSDN文库。

上面链接中提供的例程有3个,分别对本系列博文(QCustomPlot(二)、QXlsx(三)、log(四))中第三方库文件QXlsx、log4qt、qcustomplot的封装示例。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt 联合Halcon视觉框架(1)

文章目录 效果QHalconWind 类回调函数刷新窗口构造函数保证窗口大小和Halcon 窗口大小一致绘制图片获取坐标点设置坐标点鼠标拖动图片鼠标按下鼠标抬起鼠标双击滚轮放大缩小图片 效果 QHalconWind 类 // HALCON/Qt pattern matching and measure example // // (c) 2004-2017 …

AI大模型学习笔记|人工智能的发展历程、智能体的发展、机器学习与深度学习的基本理论

学习链接:冒死上传!价值2W的大模型入门到就业教程分享给大家!轻松打造专属大模型助手,—多模态、Agent、LangChain、ViT、NLP_哔哩哔哩_bilibili 百度网盘自己整理的笔记: 通过网盘分享的文件:1-人工智能的…

Vue项目打包部署到服务器

1. Vue项目打包部署到服务器 1.1. 配置 (1)修改package.json文件同级目录下的vue.config.js文件。 // vue.config.js module.exports {publicPath: ./, }(2)检查router下的index.js文件下配置的mode模式。   检查如果模式改…

docker的网络类型和使用方式

docker的网络类型 5种网络类型 bridge 默认类型,桥接到宿主机docker0的网络,有点类似于VM虚拟机的NAT网络模型。 案例: docker run --rm -itd --network bridge --name wzy666wzy-bridge alpine host host类型,共享宿主机的网络空间&#…

数字IC后端实现常见的physical only cell都有哪些?如何添加这些cell?

数字IC后端实现阶段常见功能cell有哪些?比如AND,AOI,NAND等。 physical cell有哪些?都是干什么用的? 数字后端零基础入门系列 | Innovus零基础LAB学习Day9 (1) well tap cells:防止…

c++中类的应用综合练习

整理思维导图 课上类实现> 、<、!、||、&#xff01;和后自增、前自减、后自减运算符的重载 代码部分&#xff1a; #include <iostream> using namespace std; class complex {int rel;int vir; public:complex(int rel,int vir):rel(rel),vir(vir){}complex(){}…

ElasticSearch 搜索、排序、分页功能

一、DSL 查询文档 ElasticSearch 的查询依然是基于 json 风格的 DSL 来实现的。 官方文档&#xff1a;https://www.elastic.co/guide/en/elasticsearch/reference/8.15/query-dsl.html 1.1 DSL 查询分类 常见的查询类型包括&#xff1a; 查询所有&#xff1a;查询出所有数…

mybatis常见错误

1.没有在mybatis.xml里面引入映射文件 2. 连接数据库部分有误 3.控制台输出无误&#xff0c;数据库里只插入了id sql语句有误 正确 <insert id"add" useGeneratedKeys"true" keyProperty"id">insert into t_teacher values (null,#{nam…

GLM-4-Plus初体验

引言&#xff1a;为什么高效的内容创作如此重要&#xff1f; 在当前竞争激烈的市场环境中&#xff0c;内容创作已成为品牌成功的重要支柱。无论是撰写营销文案、博客文章、社交媒体帖子&#xff0c;还是制作广告&#xff0c;优质的内容不仅能够帮助品牌吸引目标受众的注意力&a…

Mac/Windows端长期破解myBase8方法(无需安装火绒)

提醒 不管哪个端&#xff0c;都需要先退出myBase。 Mac 进入用户根目录/Users/c0ny100&#xff0c;即下边是Macintosh HD > 用户 > [你的用户名]这个界面然后按ShiftCommond.&#xff0c;显示隐藏文件。找到.Mybase8.ini文件 打开.Mybase8.ini文件&#xff0c;删除Fir…

Capture绘制元器件(Candance 17.4)

step1&#xff1a;新建元器件库 step2&#xff1a;新建元器件 step3&#xff1a;新建元器件,填写元器件名称以及类型 step4&#xff1a;绘制元器件形状 step5&#xff1a;添加引脚 添加引脚名称以及序号 将GND、VIN等电源属性引脚从Passive改为Power&#xff0c;其余为Passive …

支持自定义离线地图地理区域,查询组件及数据源功能增强,DataEase开源BI工具v2.10.3 LTS发布

2024年12月9日&#xff0c;人人可用的开源BI工具DataEase正式发布v2.10.3 LTS版本。 这一版本的功能变动包括&#xff1a;数据源方面&#xff0c;API数据源和Excel数据源支持对字段类型和长度进行设置&#xff1b;图表方面&#xff0c;离线类地图支持自定义地理区域设置&#…

【Unity学习笔记·第十二】Unity New Input System 及其系统结构和源码浅析

转载请注明出处&#xff1a;&#x1f517;https://blog.csdn.net/weixin_44013533/article/details/132534422 作者&#xff1a;CSDN|Ringleader| 主要参考&#xff1a; 官方文档&#xff1a;Unity官方Input System手册与API官方测试用例&#xff1a;Unity-Technologies/InputS…

STM32F103单片机HAL库串口通信卡死问题解决方法

在上篇文章 STM32F103单片机使用STM32CubeMX创建IAR串口工程 中分享了使用cubeMX直接生成串口代码的方法&#xff0c;在测试的过程中无意间发现&#xff0c;串口会出现卡死的问题。 当串口一次性发送十几个数据的时候&#xff0c;串口感觉像卡死了一样&#xff0c;不再接收数据…

【指南】03 CSC联系外导

确定外导 课题组有合作关系的国外导师与自己研究方向密切相关的国外导师国外高校官网、谷歌学术、Research Gate等平台检索不可以是中国港澳台的高校科研院所或机构注意外导所在高校排名和科研水平可列表记录注意外国签证政策 发送邮件 自我介绍简要介绍CSC介绍自己的研究对…

umi实现动态获取菜单权限

文章目录 前景登录组件编写登录逻辑菜单的时机动态路由页面刷新手动修改地址 前景 不同用户拥有不同的菜单权限&#xff0c;现在我们实现登录动态获取权限菜单。 登录组件编写 //当我们需要使用dva的dispatch函数时&#xff0c;除了通过connect函数包裹组件还可以使用这种方…

swagger-codegen

一、通过Swagger生成客户端代码 下载&#xff1a;https://github.com/swagger-api/swagger-codegen#编译打包 cd E:\软件空间\代码生成\swagger-codegen-3.0.64 mvn clean package#指定swagger地址生成客户端代码 cd E:\软件空间\代码生成\swagger-codegen-3.0.64\modules\swa…

Kael‘thas Sunstrider Ashes of Al‘ar

Kaelthas Sunstrider 凯尔萨斯逐日者 <血精灵之王> Kaelthas Sunstrider - NPC - 魔兽世界怀旧服TBC数据库_WOW2.43数据库_70级《燃烧的远征》数据库 Ashes of Alar 奥的灰烬 &#xff08;凤凰 310%速度&#xff09; Ashes of Alar - Item - 魔兽世界怀旧服TBC数据…

7.Vue------$refs与$el详解 ------vue知识积累

$refs 与 $el是什么&#xff1f; 作用是什么? ref&#xff0c;$refs&#xff0c;$el &#xff0c;三者之间的关系是什么&#xff1f; ref (给元素或者子组件注册引用信息) 就像你要给元素设置样式&#xff0c;就需要先给元素设定一个 class 一样&#xff0c;同理&#xff0c;…

医院门诊预约挂号管理系统设计与实现

文末获取源码和万字论文&#xff0c;制作不易&#xff0c;感谢点赞支持。 医院门诊预约挂号管理系统设计与实现 摘 要 本医院门诊预约挂号管理系统是针对目前医院门诊预约挂号管理的实际需求&#xff0c;从实际工作出发&#xff0c;对过去的医院门诊预约挂号管理系统存在的问题…