一、gflags简单介绍
gflags是google开源的一套命令行参数解析工具。通常在项目开发中会有一种需求:
- 可以在代码运行的时候指定某些代码中某些参数的值
- 如果没有显式指定,这些参数可以使用默认的值
比如:服务器编程中需要用到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后,读者已经大致明白了这个库怎么用,我最后简单的说明几点:
使用前要先定义要使用的参数
例如前面代码中的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
使用参数在参数名前加上
FLAGS_
例如前面代码中的FLAGS_ip。在main函数开始时要初始化gflags
例如前面代码中的gflags::ParseCommandLineFlags(&argc, &argv, true);。
三、如何编译使用gflags的代码
在编译的时候要加上-lgflags和-lpthread,因为gflags内部是需要POSIX线程库支持的,所以还需要加上-lpthread。
除了这两个外,也需要指定你安装的gflags的库文件(gcc选项:-L)和头文件(gcc选项:-I)。由于我把这两个放到了系统默认寻找的路径,所以在编译的时候没有显式指定。
版权声明:本文为zanda_原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。