一些c++库的使用总结

简介

本文介绍一些c++库的使用。

gflags

简单实用

gflags是一个流行的解析命令行的c++库。用户使用这个库定义的变量,可以通过多种途径进行赋值。

gflags支持定义多种数据类型,包括bool、int32、int64、uint64、double、string。

定义一个变量的操作如下:

1
DEFINE_bool(name, "default value", description);

然后在main函数开头添加google::ParseCommandLineFlags(&argc, &argv, true);,在main函数末尾添加google::ShutDownCommandLineFlags();

如果需要使用一个已经定义过的flags变量,则需要使用DECLARE_XXX,否则将会提示没有申明过这个变量。

gflags提供参数校验器,使用RegisterFlagValidator函数注册校验器。

gflags提供google::SetVersionString()函数设置版本信息(—version时返回的字符)。

gflags提供gflags::SetUsageMessage函数设置帮助信息(—help时返回的字符)。

gflags提供–flagfile参数指定配置文件,gflags将从这个配置文件中读取配置信息,同时,这个配置文件中也支持—flagfile读取配置。

gflags提供—fromenv参数从环境变量中读取配置信息。

编译实用

gflags一个比较坑的地方是,默认情况下gflags库的namespace是flags,而一大批依赖这个库的第三方库使用的google名字空间下的gflags。为了解决这个问题,需要在编译时指定名字空间(添加参数-DGFLAGS_NAMESPACE=google)。

有时候可能把gflags链接到动态链接库中,编译时的flags需要添加-fPIC,解决方法是在gflags中找到CMakeLists.txt中添加add_compile_options(-fPIC) 。

默认情况下gflags使用Release编译的,为了方便调试,建议设置-DCMAKE_BUILD_TYPE=RelWithDebInfo,即设置-o2 -g

glog

使用

它是一个使用方便的日志库,这个库是一个带buffer的同步日志,不宜打太大的日志,也不宜打请求级别的日志。
如果需要打请求级别的日志,还是需要换成其他异步日志。

使用起来极其方便,包含头文件(glog/logging.h),然后直接使用。

需要注意的是,FATAL日志会出core。

glog支持DLOG功能,这类日志在添加NDEBUG下不会打印DLOG日志,在没有这个flag下会打印这个日志,方便用户调试。

glog支持VLOG功能,这类日志划分为多个级别,通过命令行参数控制打印的级别。

使用时,在main函数开始添加google::InitGoogleLogging(argv[0]);开启使用glog之旅。

编译

glog依赖gflags库,使用glog的话建议先安装一下gflags,同时名字空间设置成google。

编译glog之前,先指定gflags路径,使用参数CMAKE_INCLUDE_PATH和CMAKE_LIBRARY_PATH完成。

rocksdb

一个内嵌kv存储,常被用做各种分布式kv存储系统。
它也可以用来简单存个数据,做个二级存储啥的,作为一次存储性能还是不够的,毕竟跳表的性能没法跟哈希表比。

使用

编译

这个库依赖flags,所以编译前可以指定一下gflags,并添加参数-DWITH_GFLAGS=1指定依赖flags。

fruit

使用

这是一个基于元编程实现的依赖注入库。

编译

这个库依赖boost,编译时需要指定boost的目录,使用参数-DBoost_INCLUDE_DIR=指定boost位置。

这个库编译时建议添加-DBUILD_SHARED_LIBS=OFF关闭动态链接库。

protobuf

老牌的序列化、反序列化工具,常被用于各种rpc框架,数据传输等。
除此之外:

  • 可以序列化json。配合阿波罗实现一套强大的在线配置系统
  • 文本格式。一套简单实用的配置系统

需要注意的是,基于bazel构建时默认开启编译优化;如果使用autogen.sh + configure构建时,需要手工添加”O2 -g”,不然就没开优化。

folly

facebook开源的重量级库,极大的补充了c++的“基础设施”。
不足点,依赖比较多,编译起来比较费劲。

abseil

google开源的,对c++stl的补充,功能较少,更多的是兼容语言特性,让c++11标准下用上c++17、c++20的特性。
不足之处,代码不多,静态库一大堆,建议使用bazel或者cmake的find_package进行依赖打平,不然解决依赖问题就够麻烦的了。

boost

c++ stl的补充,stl的候选集。
与folly、abseil相比,功能上 folly > boost > abseil,性能上folly = abseil > boost。
编译安装、链接这块相对于folly、abseil容易。

fmt

字符串格式化库,部分已经进入c++20,纯头文件。

catch2

单侧库,纯头文件,编译起来慢。

poco

面向应用的库,各种常用中间件、工具封装都有,不过性能一般,没在生产环境使用过。