gflags简明使用指南 客官°小女子只卖身不卖艺 2021-12-09 05:59 393阅读 0赞 ## 一、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` 运行结果: * 使用默认值 ![在这里插入图片描述][20190716131527513.jpg] * 不使用默认值 ![在这里插入图片描述][20190716131639190.jpg] 如果用上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` > 注:为什么这么编译?请看三。 运行结果: * 使用默认值 ![在这里插入图片描述][20190716133645413.jpg] * 不使用默认值 ![在这里插入图片描述][20190716133658791.jpg] 相信经过上面那个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`)。由于我把这两个放到了系统默认寻找的路径,所以在编译的时候没有显式指定。 [20190716131527513.jpg]: /images/20211209/1f9c5a82b2e340729a799dd1ec2effeb.png [20190716131639190.jpg]: /images/20211209/8ff02f95fc5847698c264945a6412476.png [20190716133645413.jpg]: /images/20211209/5c58f2bd246a4b97a4633733280b0e40.png [20190716133658791.jpg]: /images/20211209/f8c5340730f44a3c8acb3a32f91c2b27.png
还没有评论,来说两句吧...