gflags 是一个 C++ 库,用于解析命令行参数。安装步骤:
$ git clone https://github.com/gflags/gflags.git
$ cd gflags
$ mkdir build-dir
$ cd build-dir
$ cmake ..
$ make
$ sudo make install
CMakeListsx.txt使用
find_package (gflags REQUIRED)
include_directories (${gflags_INCLUDE_DIR})
add_executable (main main.cpp)
target_link_libraries (main gflags)
使用方法
- 定义一个命令行 flag,port,它的类型是gflags::int32,默认值是8080。除了int32之外,gflags 还支持bool、int64、uint64、double和string类型。
DEFINE_string(变量名,默认值,描述);
DEFINE_int32(port, 8080, "What port to listen on");
- 在main函数加入如下解析命令行参数,一般都放在 main 开始位置
gflags::ParseCommandLineFlags(&argc, &argv, true);
- 访问参数
使用FLAGS_ + DEFINE_string 中申明的变量名即可调用
std::cout << "m is: " << FLAGS_m << endl;
命令行运行
./main --port=5800 --debug
示例:
#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;
}
-
跨文件调用
访问在另一个文件定义的 gflags 变量,使用 DECLARE_,它的作用就相当于用 extern 声明变量。
例如,在foo.cc 定义了一个 gflags 变量 DEFINE_string(name, ‘bob’, ‘’),在 foo.h 中声明 DECLARE_string(name),然后在使用该变量的文件中 include “foo.h” 就可以。 -
帮助和版本信息
SetVersionString() 和 SetUsageMessage() 一定要在 ParseCommandLineFlags() 之前设定。
gflags::SetVersionString("1.0.0");//设置版本,./gflag_test --version的时候会显示
gflags::SetUsageMessage("Usage: ./gflags_test");//帮助信息设置
- 参数少显示帮助信息
if(argc<3)
gflags::ShowUsageWithFlagsRestrict(argv[0], "gflags_test");//注意:第二个参数是限制的model_name
示例:
#include <gflags/gflags.h>
#include <iostream>
#include <string>
using namespace std;
DEFINE_string(ip, "127.0.0.1", "ip address");
DEFINE_int32(port, 8080, "port");
DEFINE_double(retry_ratio,0.5,"retry connect");
DEFINE_bool(daemon,false,"daemon flag");
int main(int argc,char* argv[]) {
gflags::SetVersionString("1.0.0");
string usage_str = "Usage: ";
usage_str+=argv[0];
gflags::SetUsageMessage(usage_str);
if(argc<2){
gflags::ShowUsageWithFlagsRestrict(argv[0], "gflags_test");
return 0;
}
gflags::ParseCommandLineFlags(&argc, &argv, true);
cout<<"ip:"<<FLAGS_ip<<endl;
cout<<"port:"<<FLAGS_port<<endl;
cout<<"retry_ratio:"<<FLAGS_retry_ratio<<endl;
cout<<"daemon:"<<FLAGS_daemon<<endl;
return 0;
}