一、基础知识
1、Gflags是一种命令行解析工具(处理命令行参数的库),主要用于解析用命令行执行可执行文件时传入的参数。在gflags中flag可以分散的定义在各个文件之中,而不用定义在一起,这就意味着在我们可以在一个单独的文件中只定义这个文件所需要用到的一些flag,链接了该文件应用都可以使用该文件中的flag,这样就能非常方便的实现代码的复用,如果不同的文件定义了相同的flag,则会产生错误,所以需要明确规范gflags的使用规范。
2、gflags支持的参数类型如下
DEFINE_bool: boolean
DEFINE_int32: 32-bit integer
DEFINE_int64: 64-bit integer
DEFINE_uint64: unsigned 64-bit integer
DEFINE_double: double
DEFINE_string: C++ string
定义参数通过DEFINE_type宏实现,如下所示,分别定义了一个bool和一个string类型的参数,该宏的三个参数含义分别为命令行参数名,参数默认值,以及参数的帮助信息。
DEFINE_bool(big_menu, true, "Include 'advanced' options in the menu listing");
DEFINE_string(languages, "english,french,german",
"comma-separated list of languages to offer in the 'lang' menu");
3、google::ParseCommandLineFlags(&argc, &argv, true);
argc 命令行传递的参数个数,argv为命令行传递的参数表,第三个参数功能如下
- ture:函数处理完成后,argv中只保留argv[0],argc会被设置为1
- false:argv和argc会被保留,但是注意函数会调整argv中的顺序。
二、Gflags安装
1、下载glags源码
git clone https://github.com/gflags/gflags.git
2、进入clone后的gflags目录,在此目录中创建build目录
mkdir build
3、在build目录下执行cmake ..
4、执行make 编译
5、执行安装命令
make install
三、Gflags使用
1、编写testglfags.cpp
内容如下:
#include <iostream>
#include <gflags/gflags.h>
using namespace std;
DEFINE_bool(isvip, false, "If Is VIP");
DEFINE_string(ip, "127.0.0.1", "connect ip");
DECLARE_int32(port);
DEFINE_int32(port, 80, "listen port");
int main(int argc, char** argv)
{
gflags::ParseCommandLineFlags(&argc, &argv, true);
std::cout<<"ip:"<<FLAGS_ip<<std::endl;
std::cout<<"port:"<<FLAGS_port<<std::endl;
if (FLAGS_isvip)
{
std::cout<<"isvip:"<<FLAGS_isvip<<std::endl;
}
gflags::ShutDownCommandLineFlags();
return 0;
}
2、执行编译命令
sudo g++ -Wall -o testgflags testgflags.cpp -lgflags -lpthread
出现以下错误:
执行如下语句,解决此错误问题:
sudo apt-get purge libgflags-dev
重新编译,编译成功。
3、执行该程序
测试成功!
4、进一步扩展
如果命令参数过多,还需要每次运行的时候输入命令参数,这样太麻烦,可以把命令参数提前写入flag文件,然后使用。
编译flagfile.flags文件
文件内容如下:
-ip="192.168.31.14" -port=8000 -isvip=ture
不用编译cpp文件,直接运行
参考链接: