文章目录
0. gflags 是什么?
gflags 是 google 开源的用于处理命令行参数的项目。使用c++开发,具备python接口。
项目地址:https://github.com/gflags/gflags
1. gflags 安装编译
-
下载
gflags
1git clone https://github.com/gflags/gflags
-
编译安装
cd gflags # 进入项目文件夹 cmake . # 使用 cmake 编译生成 Makefile 文件 make -j 24 # make 编译 sudo make install # 安装库
编译的时候加上
gflags
动态链接库
2. gflags 使用
2.1. 简单用法
-
加上
gflags
头文件#include <gflags/gflags.h>
-
将需要命令行参数变量进行定义
用法如下:DEFINE_string(变量名,默认值,描述);
DEFINE_string
只是其中一种类型,其他类型还有:gflags 定义类型 描述 DEFINE_bool 布尔类型 DEFINE_int32 32 位整数 EFINE_int64 64 位整数 DEFINE_uint64 无符号 64 位整数 EFINE_double 浮点类型 double DEFINE_string C++ string 类型 -
在main函数加入如下解析命令行参数,一般都放在 main 开始位置
gflags::ParseCommandLineFlags(&argc, &argv, true);
-
访问参数
std::cout << "MYSTR is: " << FLAGS_mystr << endl;
注意使用
FLAGS_
+DEFINE_string
中申明的变量名即可调用 -
使用
➜ g++ gflags_test.cc -o gflags_test -lgflags -lpthread #-l 链接库进行编译 ➜ ./gflags_test -mystr="this is a value of gflags' member " # 使用 MYSTR is: this is a value of gflags' member # 输出
每一种类型的定义和使用都跟上面我们的例子相似,有所不同的是 bool 参数,bool 参数在命令行可以不指定值也可以指定值,假如我们定义了一个 bool 参数 debug_bool,可以在命令行这样指定2:
➜ ./gflags_test -debug_bool # 这样就是 true ➜ ./gflags_test -debug_bool=true # 这样也是 true ➜ ./gflags_test -debug_bool=1 # 这样也是 true ➜ ./gflags_test -debug_bool=false # 0是false
所有我们定义的 gflags 变量都可以通过 FLAGS_ 前缀加参数名访问,gflags 变量也可以被自由修改
2.2. 简单使用实例
#include <iostream>
#include <gflags/gflags.h>
DEFINE_string(name, "zhang san", "your name");
DEFINE_int32(age, 18, "your age");
int main(int argc, char** argv) {
gflags::ParseCommandLineFlags(&argc, &argv, true);
std::cout << "your name is : " << FLAGS_name
<< ", your age is: " << FLAGS_name << std::endl;
return 0;
}
2.3. 进阶使用
2.3.1. 跨文件调用
如果你想要访问在另一个文件定义的 gflags
变量呢?使用 DECLARE_
,它的作用就相当于用 extern
声明变量。为了方便的管理变量,我们推荐在 .cc
或者 .cpp
文件中DEFINE
变量,然后只在对应.h
中或者单元测试中 DECLARE
变量。
例如,在foo.cc
定义了一个 gflags
变量 DEFINE_string(name, 'bob', '')
,假如你需要在其他文件中使用该变量,那么在 foo.h
中声明 DECLARE_string(name)
,然后在使用该变量的文件中 include "foo.h"
就可以。当然,这只是为了更好地管理文件关联,如果你不想遵循也是可以的。
2.3.2. 参数检查
使用方法如下:
- 定义校验函数:
static bool ValidatePort(const char* flagname, int32 value) {
if (value > 0 && value < 200)
return true;
printf("Invalid value for --%s: %d\n", flagname, (int)value);
return false;
}
-
使用全局 static 变量来注册函数,static 变量会在 main 函数开始时就调用, 在
DEFINE
下定义DEFINE_int32(age, 18, "your age"); static const bool port_dummy = gflags::RegisterFlagValidator(&FLAGS_port, &ValidatePort);
-
在输入不合法是就会报错
2.3.3. flagfile 使用配置文件
-
在一个配置文件中写上,在此将其命名为 user.flags:
--name="zhangsan" --age=18
-
使用
➜ ./gflags_test --flagfile user.flags