gflags

官⽅⽂档: https://gflags.github.io/gflags/
代码仓库:https://github.com/gflags/gflags

flags是 Google 开发的⼀个开源库,⽤于 C++ 应⽤程序中命令⾏参数的声明、定义和解析。gflags 库提供了⼀种简单的⽅式来添加、解析和⽂档化命令⾏标志(flags),使得程序可以根据不同的运⾏时配置进⾏调整。
它具有如下⼏个特点:

• 易于使⽤:gflags 提供了⼀套简单直观的 API 来定义和解析命令⾏标志,使得开发者可以轻松地为应⽤程序添加新的参数。

• ⾃动帮助和⽂档:gflags 可以⾃动⽣成每个标志的帮助信息和⽂档,这有助于⽤⼾理解如何使⽤程序及其参数。

• 类型安全:gflags ⽀持多种数据类型的标志,包括布尔值、整数、字符串等,并且提供了类型检查和转换。

• 多平台⽀持:gflags 可以在多种操作系统上使⽤,包括 Windows、Linux 和 macOS。

• 可扩展性:gflags 允许开发者⾃定义标志的注册和解析逻辑,提供了强⼤的扩展性。

gflags安装
直接命令安装:sudo apt-get install libgflags-dev
原码安装:
# 下载源码 git clone https://github.com/gflags/gflags.git
# 切换⽬录 cd gflags/  mkdir build  cd build/
# ⽣成 Makefile cmake ..
# 编译代码 make
# 安装 make install

gflags使⽤

头⽂件
使⽤gflags库来定义/解析命令⾏参数必须包含如下头⽂件

#include <gflags/gflags.h>

定义参数

利⽤ gflags 提供的宏定义来定义参数。该宏的 3 个参数分别为命令⾏参数名,参数默认值,参数的帮助信息。

DEFINE_bool(reuse_addr, true, "是否开始⽹络地址重⽤选项");
DEFINE_int32(log_level, 1, "⽇志等级:1-DEBUG, 2-WARN, 3-ERROR");
DEFINE_string(log_file, "stdout", "⽇志输出位置设置,默认为标准输出");

gflags⽀持定义多种类型的宏函数:

DEFINE_bool
DEFINE_int32
DEFINE_int64DEFINE_uint64
DEFINE_double
DEFINE_string

访问参数
我们可以在程序中通过 FLAGS_reuse_addr 像正常变量⼀样访问标志参数。⽐如在上⾯的例⼦中,我们可以通过 FLAGS_log_level 和 FLAGS_log_file 变量来访问命令⾏参数。

不同⽂件访问参数
如果想再另外⼀个⽂件访问当前⽂件的参数,以参数 FLAGS_reuse_addr 为例,我们可以使⽤⽤宏 DECLARE_bool(reuse_addr) 来声明引⼊这个参数。其实这个宏就相当于做了 extern FLAGS_reuse_addr , 定义外部链接属性。

初始化所有参数
当我们定义好参数后,需要告诉可执⾏程序去处理解析命令⾏传⼊的参数,使得 FLAGS_* 变量能得到正确赋值。我们需要在main函数中,调⽤下⾯的函数来解决命令⾏传⼊的所有参数。

int main(int argc, char *argv[]){
         google::ParseCommandLineFlags(&argc, &argv, true);
         return 0;
}

第三个参数被称为 remove_flags 。如果它为 true , 表⽰ ParseCommandLineFlags 会从argv 中移除标识和它们的参数,相应减少 argc 的值。如果它为false , ParseCommandLineFlags 会保留 argc 不变,但将会重新调整它们的顺序,使得标识再前⾯。

运⾏参数设置

string和int设置参数

exec --log_file="./main.log"
exec -log_file="./main.log"
exec --log_file "./main.log"
exec -log_file "./main.log"

bool设置参数

exec --reuse_addr
exec --noreuse_addrexec --reuse_addr=true
exec --reuse_addr=false

配置⽂件的使⽤
配置⽂件的使⽤,其实就是为了让程序的运⾏参数配置更加标准化,不需要每次运⾏的时候都⼿动收⼊每个参数的数值,⽽是通过配置⽂件,⼀次编写,永久使⽤。需要注意的是,配置⽂件中选项名称必须与代码中定义的选项名称⼀致,尤其需要注意的是配置⽂件中的字符串数据不需要使⽤双引号。

main.conf

-reuse_addr=true
-log_level=3
-log_file=./log/main.log

使用:

exec --flagfile=filename

特殊参数标识
gflags也默认为我们提供了⼏个特殊的标识。

--help # 显⽰⽂件中所有标识的帮助信息
--helpfull # 和-help ⼀样, 帮助信息更全⾯⼀些
--helpshort # 只显⽰当前执⾏⽂件⾥的标志
--helpxml # 以 xml ⽅式打印,⽅便处理
--version # 打印版本信息,由 google::SetVersionString()设定
--flagfile -flagfile=f #从⽂件 f 中读取命令⾏参数

编译:

g++ main.cc -o main -lgflags

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注