gflags简明使用指南

一、gflags简单介绍

gflags是google开源的一套命令行参数解析工具。通常在项目开发中会有一种需求:

  1. 可以在代码运行的时候指定某些代码中某些参数的值
  2. 如果没有显式指定,这些参数可以使用默认的值

比如:服务器编程中需要用到IP和端口号。但是这两个变量有时候在具体使用程序的时候才会有具体的值,如果不用gflags可以这么写

//test.cc
#include <iostream>
#include <string>
//else header file

#define LOG 

class Server{
public:
  Server(const std::string& ip = "127.0.0.1" , uint16_t port = 8080) : _ip(ip), _port(port) {
    std::cout << "Init Server..." << std::endl;
#ifdef LOG 
    std::cout << "ip  : " << _ip << std::endl;
    std::cout << "port: " << _port << std::endl;
#endif
    std::cout << "Init OK!" << std::endl;
  }
  //else code
private:
  std::string _ip;
  uint16_t _port;
  //else code
};

int main(int argc, char* argv[]) {
  Server *pserver;
  if(argc != 1) {
    pserver = new Server(argv[1], atoi(argv[2]));
  }else{
    pserver = new Server;
  }
  
  return 0;
}

编译:
g++ test.cc -o test -std=c++11
运行结果:

  • 使用默认值
    在这里插入图片描述
  • 不使用默认值
    在这里插入图片描述

如果用上gflags,请看二。

二、如何在代码中使用

还是上面那个情景,如果用gflags可以这么写:

//test2.cc
#include <iostream>
#include <string>
#include <gflags/gflags.h> //gflags库的头文件
//else header file

#define LOG

DEFINE_string(ip, "127.0.0.1", "IP address");
DEFINE_int32(port, 8080, "port");

class Server{
public:
  Server(const std::string& ip, uint16_t port) : _ip(ip), _port(port) {
    std::cout << "Init Server..." << std::endl;
#ifdef LOG 
    std::cout << "ip  : " << _ip << std::endl;
    std::cout << "port: " << _port << std::endl;
#endif
    std::cout << "Init OK!" << std::endl;
  }
  //else code
private:
  std::string _ip;
  uint16_t _port;
  //else code
};


int main(int argc, char* argv[]) {
  gflags::ParseCommandLineFlags(&argc, &argv, true);  
  Server* pserver = new Server(FLAGS_ip, FLAGS_port);

  return 0;
}

编译:
g++ test2.cc -o test2 -lgflags -lpthread

注:为什么这么编译?请看三。

运行结果:

  • 使用默认值
    在这里插入图片描述
  • 不使用默认值
    在这里插入图片描述
    相信经过上面那个demo后,读者已经大致明白了这个库怎么用,我最后简单的说明几点:
  1. 使用前要先定义要使用的参数
    例如前面代码中的DEFINE_string(ip, "127.0.0.1", "IP address");,这个宏的三个参数分别是:要使用的参数名,参数的默认值,参数的说明。gflags支持以下参数类型:

    • DEFINE_bool: bool
    • DEFINE_int32: 32-bit integer
    • DEFINE_int64: 64-bit integer
    • DEFINE_uint64: unsigned 64-bit integer
    • DEFINE_double: double
    • DEFINE_string: C++ string
  2. 使用参数在参数名前加上FLAGS_
    例如前面代码中的FLAGS_ip

  3. 在main函数开始时要初始化gflags
    例如前面代码中的gflags::ParseCommandLineFlags(&argc, &argv, true);

三、如何编译使用gflags的代码

在编译的时候要加上-lgflags-lpthread,因为gflags内部是需要POSIX线程库支持的,所以还需要加上-lpthread
除了这两个外,也需要指定你安装的gflags的库文件(gcc选项:-L)和头文件(gcc选项:-I)。由于我把这两个放到了系统默认寻找的路径,所以在编译的时候没有显式指定。


版权声明:本文为zanda_原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。