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中做一些配置:


  1. 把spdlog的头文件目录添加到整个项目的头文件搜索目录中
  2. add_subdirectory spdlog,相当于编译spdlog
  3. 项目的库依赖spdlog


相关语句如下:

include_directories(. third_party/spdlog/include)

# 一定要定义这个宏,否则会导致Custom Formatting功能异常
# 详见 <https://github.com/gabime/spdlog/wiki/3.-Custom-formatting>
add_definitions(-DSPDLOG_ACTIVE_LEVEL=SPDLOG_LEVEL_TRACE)

add_subdirectory(third_party/spdlog)

if(BUILD_BURIED_STATIC_LIBS)
add_library(${MODULE_NAME}_static STATIC ${BURIED_SRCS})
target_link_libraries(${MODULE_NAME}_static PRIVATE ${LIBS} spdlog)
endif()

if(BUILD_BURIED_SHARED_LIBS)
add_library(${MODULE_NAME}_shared SHARED ${BURIED_SRCS})
target_link_libraries(${MODULE_NAME}_shared PRIVATE ${LIBS} spdlog)
endif()


具体使用详见: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,可以直接从这个网站下载。


https://sqlitebrowser.org/dl/


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




网络库


因为项目需要使用网络功能,熟悉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,为什么?

  1. mbedtls功能丰富,各种加解密能力都有,基本可以对标openssl
  2. 集成方便,跨平台,而且体积小,非常适合在客户端使用,很多嵌入式应用也都会使用这个三方库。


如何依赖mbedtls?


去github上下载对应源代码,我这里选择的是v3.5.0的tag:

https://github.com/Mbed-TLS/mbedtls/tree/v3.5.0



放置在src/third_party下,然后在CMakeLists.txt中引入即可使用:


include_directories(. third_party third_party/mbedtls/include)

add_subdirectory(third_party/mbedtls/library)

if(BUILD_BURIED_STATIC_LIBS)
add_library(${MODULE_NAME}_static STATIC ${BURIED_SRCS})
target_link_libraries(${MODULE_NAME}_static PRIVATE ${LIBS} spdlog mbedtls_static)
endif()

if(BUILD_BURIED_SHARED_LIBS)
add_library(${MODULE_NAME}_shared SHARED ${BURIED_SRCS})
target_link_libraries(${MODULE_NAME}_shared PRIVATE ${LIBS} spdlog mbedtls_static)
endif()


具体依赖方式可以参考:https://github.com/chengxumiaodaren/BuriedPoint/blob/1.0.1.0/src/CMakeLists.txt


mbedtls的CMakeLists.txt,我做了改造,大家链接的时候可以直接使用我源码中的mbedtls,使用官方的可能编译不过。


到这里,项目中需要依赖的三方库选型都已经介绍完毕,后面章节我会具体介绍如何借用这些三方库的能力进行需求开发。

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
程序喵
下载 APP