简介
本文介绍一些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
面向应用的库,各种常用中间件、工具封装都有,不过性能一般,没在生产环境使用过。