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