[C++][第三方库][gflags]详细讲解
目录
- 1.介绍
- 2.安装
- 3.使用
- 1.包含头文件
- 2.定义参数
- 3.访问参数
- 4.不同文件访问参数
- 5.初始化所有参数
- 6.运行参数设置
- 7.配置文件的使用
- 8.特殊参数标识
- 4.入门示例
- 1.命令行键入参数
- 2.配置文件导入
1.介绍
gflags
是Google开发的一个开源库,用于C++应用程序中命令行参数的声明、定义和解析gflags
库提供了一种简单的方式来添加、解析和文档化命令行标志(flags
),使得程序可以根据不同的配置进行调整- 特点:
- 易于使用:
gflags
提供了一套简单直观的API来定义和解析命令行标志,使得开发者可以轻松地为应用程序添加新的参数 - 自动帮助和文档:
gflags
可以自动生成每个标志的帮助信息和文档,这有助于用户理解和如何使用程序及其参数 - 类型安全:
gflags
支持多种数据类型的标识,包括布尔值、整数、字符串等,并且提供了类型检查和转换 - 多平台支持:
gflags
可以在多种OS上使用,包括Windows、Linux和MacOS - 可拓展性:
gflags
允许开发者自定义标志的注册和解析逻辑,提供了强大的拓展性
- 易于使用:
- 官方文档
- 代码仓库
2.安装
- 直接命令安装:
sudo apt install libgflags-dev
- 源码安装:
clone
后,使用cmake
安装即可,详细可参照官方文档
3.使用
1.包含头文件
- 使用
gflags
库来定义/解析命令行参数必须包含如下头文件:#include <gflags/gflags.h>
2.定义参数
- 利用
gflags
提供的宏定义来定义参数,该宏的三个参数分别为命令行参数名、参数默认值、参数的帮助信息 gflags
支持定义多种类型的宏函数:DEFINE_bool DEFINE_int32 DEFINE_int64 DEFINE_uint64 DEFINE_double DEFINE_string
- 示例:
DEFINE_bool(debug, true, “是否开启调试”); DEFINE_int32(log_level, 1, “1-DEBUG, 2-WARN, 3-ERROR); DEFINE_string(log_file, “stdout”, ”日志输出位置, 默认为标准输出”);
3.访问参数
- 可以在程序中通过
FLAGS_name
像正常变量一样访问标志参数- 例如:可以通过
FLAGS_debug, FLAGS_log_level
变量来访问命令行参数
- 例如:可以通过
4.不同文件访问参数
- 如果想在另外一个文件访问当前文件的参数,以参数
FLAGS_debug
为例,可以使用宏DECLARE_bool(debug)
来声明引入这个参数 - 这个宏相当于做了
external FLAGS_debug;
,定义外部链接属性
5.初始化所有参数
- 当定义好参数后,需要告诉可执行程序去处理解析命令行传入的参数,使得
FLAGS_*
变量能得到正确赋值 - 需要在
main
函数中,调用下面的函数来解析命令行传入的所有参数google::ParseCommandLineFlags(&argc, &argv, true);
- 说明:
argc
和argv
是main
的入口参数- 第三个参数被称为
remove_flags
- 如果为
true
,则表示ParseCommandLineFlags
会从argv
中移除标识和它们的参数,相应减少argc
的值 - 如果为
false
,则表示ParseCommandLineFlags
会保留argc
不变,但将会重新调整他们的顺序,使得标识在前面
- 如果为
6.运行参数设置
gflags
提供了多种命令行设置参数的方式string
和int
设置参数:exec —-log_file=“./log” exec -log_file=“./log” exec —-log_file “./log” exec -log_file “./log”
bool
设置参数:exec --reuse_addr exec --noreuse_addr exec --reuse_addr=true exec --reuse_addr=false
- 说明:
--
将会终止标识的处理- 例如:
exec -f1 1 -- -f2 2
中,f1
被认为是一个标识,但f2
不会
- 例如:
7.配置文件的使用
- 配置文件的使用,其实就是为了让程序的运行参数配置更加标准化,不需要每次运行的时候都手动收入每个参数的数值,而是通过配置文件,一次编写,永久使用
- 注意:
- 配置文件中选项名称必须与代码中定义的选项名称一致
- 配置文件中,标识前面只有一个
-
- 示例:
-reuse_addr=true -log_level=3 -log_file=./log/main.log
- 使用:启动可执行程序时,带上参数
--flagfile=CONFIG_FILE
8.特殊参数标识
gflags
也默认提供了几个特殊的标识--help
:显示文件中所有标识的帮助信息--helpfull
:和-help
一样,帮助信息更全面一些--helpshort
:只显示当前执行文件里的标志--helpxml
:以xml
方式打印,方便处理- -
-version
:打印版本信息,由google::SetVersionString()
设定 --flagfile -flagfile=f
:从文件f
中读取命令行参数
4.入门示例
1.命令行键入参数
main.cc
:#include <iostream> #include <gflags/gflags.h> DEFINE_bool(debug, true, "是否开启DEBUG模式, 格式:true/false"); DEFINE_string(ip, "127.0.0.1", "服务器监听IP, 格式: 127.0.0.1"); DEFINE_int32(port, 3366, "服务器监听端口, 格式: 3366"); int main(int argc, char *argv[]) { google::ParseCommandLineFlags(&argc, &argv, true); std::cout << FLAGS_debug << std::endl; std::cout << FLAGS_ip << std::endl; std::cout << FLAGS_port << std::endl; return 0; }
makefile
:main:main.cc g++ -o $@ $^ -std=c++17 -lgflags .PHONY:clean clean: rm main
- 运行示例:
- 默认情况
$ ./main 1 127.0.0.1 3366
- 从命令行键入参数
$ ./main --debug=false --ip="www.baidu.com" --port=8899 0 www.baidu.com 8899
- 默认情况
2.配置文件导入
main.conf
:-debug=true -ip="www.baidu.com" -port=6633
- 运行示例:
$ ./main -flagfile=./main.conf 1 "www.baidu.com" 6633