gflags使用
gflags介绍
gflags库用于命令行参数的声明、定义和解析,使我们能够灵活配置程序的运行效果。例如,在服务端程序开发中,我们可以通过命令行自定义IP地址和端口号,而无需修改代码。又如,我们可以用gflags的宏定义一个“是否打印调试信息”的参数,默认值为false(不打印),如果需要打印调试信息,只需在命令行中将该参数设置为true即可。
gflags安装
dev@dev-host:~/workspace/gflags$ sudo apt-get install libgflags-dev
查看是否安装成功
$ ls /usr/include/gflags/
gflags_completions.h gflags_declare.h gflags_gflags.h gflags.h
$ whereis libgflags.so
libgflags.so: /usr/lib/x86_64-linux-gnu/libgflags.so
gflags使用
1.包含头文件#include<gflags/gflags.h>
2.定义参数(启动程序时可以用命令行指定它们,不用改代码就能控制程序行为)
DEFINE_type(参数名, 默认值, 说明参数);
type支持bool、int32、int64、uint64、double
说明参数可用./your_program --help查看
3. 访问参数
在程序中使用FLAGS_前缀就能访问标志,即命令行参数,用gflags的宏定义的参数
4.不同文件访问参数
宏声明DECLARE_bool(标志),能访问另一个文件中的参数
5.解析所有参数(让所有定义的参数被正确赋值)
google::ParseCommandLineFlags(&argc, &argv, true);
6.运行参数设置
—str_format=“xxx”
—num_format=10
—bool_format or —nobool_format
7.配置文件使用
—flagfile=f,从文件f中读取命令行参数
Demo1(默认值、命令行传标志、从文件读参)
用 gflags 定义并解析命令行参数(IP、端口、调试开关),然后打印它们的值。用户可以通过命令行(如 --ip=192.168.1.1)修改默认值
main.conf
--ip="192.168.2.3"
--port=10001
--debug_enable=true
makefile
main:main.ccg++ -std=c++17 $^ -o $@ -lgflags
main.cc
#include <gflags/gflags.h>
#include <iostream>DEFINE_string(ip, "127.0.0.1", "服务器的监听IP地址,格式:127.0.0.1");
DEFINE_int32(port, 8080, "服务器的监听端口,格式:8080");
DEFINE_bool(debug_enable, true, "是否启用调试模式, 格式:true/false");int main(int argc, char *argv[])
{google::ParseCommandLineFlags(&argc, &argv, true);std::cout << FLAGS_ip << std::endl;std::cout << FLAGS_port << std::endl;std::cout << FLAGS_debug_enable << std::endl;return 0;
}
运行代码1(打印默认值)
./main
127.0.0.1
8080
1
运行代码2(打印传入值)
./main --ip="192.168.0.1" --port=9090 --nodebug_enable
192.168.1.0
9090
0
运行代码3
./main --flagfile="./main.conf"
"192.168.2.3"
10001
1
Demo2(用另一个文件里定义的标志)
在 flags_def.cc 定义 --port 参数,在 main.cc 中声明并使用它,实现跨文件共享命令行参数
flags_def.cc
#include <gflags/gflags.h>
DEFINE_int32(port, 8080, "Port number to listen on");
main.cc
#include <gflags/gflags.h>
#include <iostream>DECLARE_int32(port); //声明int main(int argc, char *argv[])
{google::ParseCommandLineFlags(&argc, &argv, true);std::cout << FLAGS_port << std::endl;return 0;
}
编译时链接两个文件一起:
g++ main.cc flags_def.cc -lgflags -o main
运行代码1 (打印默认值)
./main
8080
运行代码2(打印传入值)
./main --port=1234
1234