使用 Google gflags 解析命令行参数

如何安装

  gflags 是一个 C++ 库,用于解析命令行参数。下面是安装步骤:

1
2
3
4
5
6
7
$ git clone https://github.com/gflags/gflags.git
$ cd gflags
$ mkdir build-dir
$ cd build-dir
$ cmake ..
$ make
$ sudo make install

  安装之后要怎么使用 gflags 呢?如果程序是使用 CMake 构建的,那么只要在 CMakeListsx.txt 里面加上下面几行配置就可以了:

1
2
3
4
5
find_package (gflags REQUIRED)
include_directories (${gflags_INCLUDE_DIR})
add_executable (main main.cpp)
target_link_libraries (main gflags)

使用介绍

  如何定义一个命令行 flag 呢?

1
2
3
4
#include <iostream>
#include <gflags/gflags.h>
DEFINE_int32(port, 8080, "What port to listen on");

  这行代码定义了一个命令行 flag,名字是 port,它的类型是gflags::int32,默认值是8080。除了int32之外,gflags 还支持boolint64uint64doublestring类型。
  定义好一个 flag 之后,还可以给它加上一个校验函数,验证 flag 的取值是否合法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <gflags/gflags.h>
static bool ValidatePort(const char* flagname, gflags::int32 value)
{
if (value > 0 && value < 32768)
{
return true;
}
return false;
}
DEFINE_int32(port, 8080, "What port to listen on");
DEFINE_validator(port, &ValidatePort);
DEFINE_bool(debug, false, "Turn on the debug mode");
int main(int argc, char *argv[])
{
gflags::ParseCommandLineFlags(&argc, &argv, true);
std::cout << "port = " << FLAGS_port << std::endl;
std::cout << "debug = " << std::boolalpha << FLAGS_debug << std::endl;
return 0;
}

  上面的代码会验证port的取值范围,如果取值不合法,则会报错:

1
2
3
4
5
6
7
8
$ ./main --port=5800 --debug
port = 5800
debug = true
$ ./main --port=5800 --nodebug
port = 5800
debug = false
$ ./main --port=100000 --debug
ERROR: failed validation of new value '100000' for flag 'port'

参考资料