5. 三方库依赖
大家好,我是程序喵。
这篇文章我会主要介绍整个项目需要的三方库,为什么要依赖这些库,如何依赖这些库?
GoogleTest
这个项目,我希望大家养成一个编程习惯,写代码要有单元测试,最好是先设计,再写测试用例,再写程序。
GoogleTest就是C++中比较好用且常见的单元测试框架。具体使用方式可以参考:https://google.github.io/googletest/primer.html
如何依赖GoogleTest?
直接上Github上搜索googletest,进入它的仓库(https://github.com/google/googletest),选择最新的release tag,我这里选择的是v1.14.0,下载到本地。


解压后拷贝到项目里,放在根目录中,目录结构如图所示:

CMakeLists.txt中除了需要把相关目录添加到头文件查找路径中,还需要add_subdirectory才行,如图:

具体可以参考:https://github.com/chengxumiaodaren/BuriedPoint/blob/1.0.1.0/CMakeLists.txt
spdlog
任何一个项目都需要打印日志,在文件或者console中打印详细的信息或者一些错误日志,方便开发者定位问题,掌握程序运行的状态等。
spdlog的使用方式可以参考:https://github.com/gabime/spdlog/tree/v1.12.0
如何依赖spdlog?
可以先在github上下载spdlog,然后拷贝到本地,本项目中使用的是v1.12.0 tag。
github链接:https://github.com/gabime/spdlog/tree/v1.12.0

spdlog不像GoogleTest,GoogleTest是测试时才会依赖,不会放在核心的代码中,简单来说就是SDK给出去的产物不会依赖GoogleTest,所以GoogleTest放在了项目的根目录中。
但是spdlog会进入SDK的代码体中,所以这里放在src的third_party目录中,如图:

使用spdlog,有两种方式:
一种是header-only方式,直接include spdlog相关的头文件就可以;
另一种方式是链接spdlog库的形式。
本项目中使用的是第二种方式,因为header-only方式下,会有很多源文件include spdlog的头文件,相当于每个源文件中都定义了很多spdlog的函数,这会导致整个SDK的体积较大。所以本项目中使用第二种方式,这种方式下需要在CMakeLists.txt中做一些配置:
- 把spdlog的头文件目录添加到整个项目的头文件搜索目录中
- add_subdirectory spdlog,相当于编译spdlog
- 项目的库依赖spdlog
相关语句如下:
具体使用详见:https://github.com/chengxumiaodaren/BuriedPoint/blob/1.0.1.0/src/buried_core.cc
后面我会详细介绍。
数据库
前面流程设计章节中咱介绍过,项目需要使用数据库做持久化操作。
客户端几乎都是使用sqlite数据库,正常使用sqlite数据库,比如增删改查,都需要写对应的sql语句才可以。
正常客户端使用sqlite,都会直接使用链接sqlite C开源库,然后写一堆sql语句,在调用一堆C语句,没有RAII,使用起来很不方便,比如每次start transtion,都需要在所有的if else分支调用transtion commit或者transtion rollback才行。
基于以上的麻烦,这里选择基于sqlite封装的一个ORM开源库,只需要定义某些struct,调用相关的函数就可以实现增删改查等能力,使用起来特别方便。
如何依赖sqlite_orm?
sqlite_orm的依赖非常简单,它只有一个头文件,我们只需include一个头文件就可以:https://github.com/fnc12/sqlite_orm/blob/master/include/sqlite_orm/sqlite_orm.h
因为sqlite_orm是sqlite的封装,所以它还是需要依赖sqlite,而sqlite的依赖也比较简单,可以去这个网站下载https://www.sqlite.org/download.html
获取sqlite3.h、sqlite3.c、sqlite3ext.h,放到项目中,如图:

具体使用方式详见:https://github.com/chengxumiaodaren/BuriedPoint/tree/1.0.1.0/src/database
这里再介绍一个查看数据库文件的工具,DB Browser,可以直接从这个网站下载。

通过这个工具,可以很方便的查看数据库中的数据,如图:

网络库
因为项目需要使用网络功能,熟悉C++的朋友应该都知道,C++标准目前最大的缺点就是没有好用的网络模块,使用网络功能都需要引用其他的三方库才可以。
这里我们也需要引入一个网络库才好,我们这里主要使用http的request能力,C++相关http三方库有很多,我考虑许久,最终选择了Boost中的Beast库,因为Beast是基于Boost的Asio封装的http模块,Asio不出意外会进入到C++26标准,我们以后肯定需要学习使用Asio,这里最好能提前接触下。
如何依赖Beast?
直接下载Boost,使用其中的Beast模块即可。
https://www.boost.org/users/download/

解压后放在当前项目的third_party目录中。

具体使用方式详见:https://github.com/chengxumiaodaren/BuriedPoint/tree/1.0.1.0/src/report
JSON
这个应该不需要我过多介绍,直接include下面的hpp头文件即可。
https://github.com/nlohmann/json/blob/develop/single_include/nlohmann/json.hpp
加解密
正常我们C++里使用加解密等能力一般可能会用到cryptopp三方库,或者使用什么加密方式就找一段对应的源代码塞到项目中。
但这个项目中,我想走个不寻常的路,引入mbedtls,为什么?
- mbedtls功能丰富,各种加解密能力都有,基本可以对标openssl
- 集成方便,跨平台,而且体积小,非常适合在客户端使用,很多嵌入式应用也都会使用这个三方库。
如何依赖mbedtls?
去github上下载对应源代码,我这里选择的是v3.5.0的tag:
https://github.com/Mbed-TLS/mbedtls/tree/v3.5.0

放置在src/third_party下,然后在CMakeLists.txt中引入即可使用:
具体依赖方式可以参考:https://github.com/chengxumiaodaren/BuriedPoint/blob/1.0.1.0/src/CMakeLists.txt
mbedtls的CMakeLists.txt,我做了改造,大家链接的时候可以直接使用我源码中的mbedtls,使用官方的可能编译不过。
到这里,项目中需要依赖的三方库选型都已经介绍完毕,后面章节我会具体介绍如何借用这些三方库的能力进行需求开发。
