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

news2024/12/14 14:50:40

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的封装示例。

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

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

相关文章

视频监控汇聚平台方案设计:Liveweb视频智能监管系统方案技术特点与应用

随着科技的发展,视频监控平台在各个领域的应用越来越广泛。然而,当前的视频监控平台仍存在一些问题,如视频质量不高、监控范围有限、智能化程度不够等。这些问题不仅影响了监控效果,也制约了视频监控平台的发展。 为了解决这些问…

跨平台开发技术的探索:从 JavaScript 到 Flutter

随着多平台支持和用户体验一致性在应用程序开发中变得越来越重要,开发者面临的挑战是如何在不同平台上保持代码的可维护性和高效性。本文将探讨如何利用现代技术栈,包括 Flutter、JavaScript、HTML5、WebAssembly、TypeScript 和 Svelte,在统一的平台上进行高效的跨平台开发…

Dcoker安装nginx,完成反向代理和负载均衡

1. 简介 官网:nginx Nginx是一个高性能的 HTTP 和反向代理 Web 服务器。它的主要功能包括反向代理、负载均衡和动静分离等。正因为 Nginx的这些功能能够为系统带来性能和安全方面的诸多优势,我们在项目部署时需要引入 Nginx组件。接下来我们会逐一向大…

Allegro X PCB设计小诀窍--如何在Allegro X中进行PCB设计评审

背景介绍:在PCB设计过程中,企业为了提升PCB设计质量,确保PCB设计的可制造性,缩短产品的研发周期,通常需要组织对PCB进行设计评审。但是目前的PCB设计评审过程存在评审文档管理繁琐、意见反馈不及时、问题传递不准确、评…

基于多视角深度学习技术的乳腺X线分类:图神经网络与Transformer架构的研究|文献速递-生成式模型与transformer在医学影像中的应用速递

Title 题目 Mammography classification with multi-view deep learning techniques:Investigating graph and transformer-based architectures 基于多视角深度学习技术的乳腺X线分类:图神经网络与Transformer架构的研究 01 文献速递介绍 乳腺X线检查是乳腺癌…

HCIA-Access V2.5_2_3_网络通信基础_以太网概述

什么是以太网 以太网是由IEEE定义的局域网技术,也是目前应用最普遍的技术,早期的令牌环网,FDDI等局域网技术都被它取代了,以太网主要分为两类,共享型以太网和交换型以太网。共享式以太网主要采用总线型的拓扑结构&…

Maven学习(Maven项目模块化。模块间“继承“机制。父(工程),子项目(模块)间聚合)

目录 一、Maven项目模块化? (1)基本介绍。 (2)汽车模块化生产再聚合组装。 (3)Maven项目模块化图解。 1、maven_parent。 2、maven_pojo。 3、maven_dao。 4、maven_service。 5、maven_web。 6…

Leecode刷题C语言之K次乘法运算后的最终数组①

执行结果:通过 执行用时和内存消耗如下: 代码如下: int* getFinalState(int* nums, int numsSize, int k, int multiplier, int* returnSize) {int *ret (int *)malloc(sizeof(int) * numsSize);memcpy(ret, nums, sizeof(int) * numsSize);while (k…

Source Insight 4.0的安装

一、安装与破解 1、下载Source Insight 4.0安装包 https://pan.baidu.com/s/1t0u1RM19am0lyzhlNTqK9Q?pwdnvmk 2、下载程序破解补丁包 https://pan.baidu.com/s/1irvH-Kfwjf4zCCtWJByqJQ 其中包含文件si4.pediy.lic 和 sourceinsight4.exe。 3、安装下载的Source Insight …

UNIX数据恢复—UNIX系统常见故障问题和数据恢复方案

UNIX系统常见故障表现: 1、存储结构出错; 2、数据删除; 3、文件系统格式化; 4、其他原因数据丢失。 UNIX系统常见故障解决方案: 1、检测UNIX系统故障涉及的设备是否存在硬件故障,如果存在硬件故障&#xf…

重生之我在异世界学编程之C语言:深入文件操作篇(上)

大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 函数递归与迭代 引言正文一、为什么要用文件二、文…

内网是如何访问到互联网的(华为源NAT)

私网地址如何能够访问到公网的? 在上一篇中,我们用任意一个内网的终端都能访问到百度的服务器,但是这是我们在互联网设备上面做了回程路由才实现的,在实际中,之前也说过运营商是不会写任何路由过来的,那对于…

VSCode 报错:rust-analyzer requires glibc >= 2.28 in latest build

报错信息 /home/jake/.vscode-server-insiders/extensions/matklad.rust-analyzer-0.3.953/server/rust-analyzer: /lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.29 not found (required by /home/jake/.vscode-server-insiders/extensions/matklad.rust-analyzer-0.3.9…

软考:工作后再考的性价比分析

引言 在当今的就业市场中,软考(软件设计师、系统分析师等资格考试)是否值得在校学生花费时间和精力去准备?本文将从多个角度深入分析软考在不同阶段的性价比,帮助大家做出明智的选择。 一、软考的价值与局限性 1.1 …

Hadoop一课一得

Hadoop作为大数据时代的奠基技术之一,自问世以来就深刻改变了海量数据存储与处理的方式。本文将带您深入了解Hadoop,从其起源、核心架构、关键组件,到典型应用场景,并结合代码示例和图示,帮助您更好地掌握Hadoop的实战…

HTML综合

一.HTML的初始结构 <!DOCTYPE html> <html lang"en"><head><!-- 设置文本字符 --><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><!-- 设置网页…

c#笔记2024

Ctrl r e自动添加get和set CompositeCurve3d 复合曲线 List<Entity> entS listline.Cast<Entity>().ToList();//list类型强转 前面拼上\u0003&#xff0c;就可以实现&#xff0c;不管有没有命令都能打断当前命令的效果 取消其他命令&#xff1a;Z.doc.SendStri…

debian12学习笔记

前置条件 基于debian12官网的qcow2格式文件进行操作 安装ssh 登录虚拟机后安装ssh服务端 apt install openssh-server配置国内源 新增/etc/apt/sources.list.d/tsinghua.list 使用清华大学的源 https://www.cnblogs.com/shanhubei/p/18104430 deb https://mirrors.tuna.t…

supervision - 好用的计算机视觉 AI 工具库

Supervision库是一款出色的Python计算机视觉低代码工具&#xff0c;其设计初衷在于为用户提供一个便捷且高效的接口&#xff0c;用以处理数据集以及直观地展示检测结果。简化了对象检测、分类、标注、跟踪等计算机视觉的开发流程。开发者仅需加载数据集和模型&#xff0c;就能轻…

QT图形/视图架构详解(一)

场景、视图与图形项 图形/视图架构主要由 3 个部分组成&#xff0c;即场景、视图和图形项&#xff0c;三者的关系如图所示&#xff1a; 场景、视图和图形项的关系 场景&#xff08;QGraphicsScene 类&#xff09; 场景不是界面组件&#xff0c;它是不可见的。场景是一个抽象的…