【gflags】【gflags实践】【gflags的学习使用记录】
【gflags】【gflags实践】【gflags的学习使用记录】
- 0 前言
- 1 gflags介绍
- 2 gflags安装
- 3 gfalgs使用
- 3.1 CMakeLists.txt
- 3.2 头文件
- 3.3 使用
- 3.3.1 使用案例一,slam十四讲的cmake使用
- 3.3.1.1 案例代码
- 3.3.1.2 使用说明
- 3.3.1.2.1 使用前定义要使用的参数
- 3.3.1.2.2 参数的使用
- 3.3.1.2.3 必要的初始化
- 3.3.1.2.4 `DECLARE_XXX`的使用
- 3.3.1.2.4 执行可执行文件常用的特殊flag
- 3.3.2 使用案例二,简单c++编译
- 3.3.2.1 案例代码
- 3.3.2.2 编译方式
- 3.3.3 使用案例三,运行可执行文件的参数设置
- 3.3.3.1 案例代码
- 3.3.3.2 编译方式
- 3.3.3.3 运行方式
- 3.3.3.3.1 无参数
- 3.3.3.3.2 指定单个参数
- 3.3.3.3.3 指定多个参数
- 3.3.4 使用案例四,配置gflags文件
- 3.3.4.1 案例代码
- 3.3.4.1.1 专门定义gflags的头文件`gflags_def.cpp`
- 3.3.4.1.2 主文件的`DECLARE_`声明
- 3.3.4.2 编译方式
- 3.3.4.3 运行
- 3.3.4.3.1 配置`.gflags`文件
- 3.3.4.3.2 运行
- 3.3.4.3.2.1 不指定gflags配置文件
- 3.3.4.3.2.2 指定gflags配置文件
- 3.3.4.3.2.3 测试修改`.gfalgs`演示
- 4 参考
0 前言
1 gflags介绍
- gflags是google开源的一套命令行参数解析工具。通常在项目开发中会有一种需求:
- 可以在代码运行的时候指定某些代码中某些参数的值
- 如果没有显式指定,这些参数可以使用默认的值
- 在工程实践中,有专门定义gflags的文件,通过–flagfile=filename来指定gflags配置文件,其他文件在使用gflags时需要先声明;通常将gflags定义在专门的配置文件中,以方便对程序运行参数管理。
- Github上的gflags项目:https://github.com/gflags/gflags
2 gflags安装
参考:【多传感器融合定位】【ubuntu18.06配置环境】【ROS melodic】【g2o】【ceres】【Geographic】【gflags】【glog】【sophus】【GTSAM】【gtest】
3 gfalgs使用
3.1 CMakeLists.txt
# gflags
find_package(GFlags REQUIRED)
include_directories(${GFLAGS_INCLUDE_DIRS})add_executable(xxx xxx.cpp)
target_link_libraries(xxx ${GFLAGS_LIBRARIES})
3.2 头文件
#include <gflags/gflags.h>
3.3 使用
3.3.1 使用案例一,slam十四讲的cmake使用
3.3.1.1 案例代码
参考:【slam十四讲第二版】【课本例题代码向】【第十三讲~实践:设计SLAM系统】的3.2.1 run_kitti_stereo.cpp
//
// Created by gaoxiang on 19-5-4.
//#include <gflags/gflags.h>
#include "myslam/visual_odometry.h"DEFINE_string(config_file, "./config/default.yaml", "config file path");int main(int argc, char **argv) {// 解析gflags参数,只需要1行代码google::ParseCommandLineFlags(&argc, &argv, true);//gflags::ParseCommandLineFlags(&argc, &argv, true);myslam::VisualOdometry::Ptr vo(new myslam::VisualOdometry(FLAGS_config_file));//assert(vo->Init() == true);//注释去这句话my_czyvo->Init();vo->Run();return 0;
}
3.3.1.2 使用说明
3.3.1.2.1 使用前定义要使用的参数
- 如
DEFINE_string(config_file, "./config/default.yaml", "config file path");
,这个宏的三个参数分别是:
- 参数
config_file
:参数名 - 参数
"./config/default.yaml"
:参数的默认值 - 参数
"config file path"
:参数的说明
- 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
3.3.1.2.2 参数的使用
- 使用参数要在参数名前加上
FLAG_
- 例如前面代码中的
FLAGS_config_file
3.3.1.2.3 必要的初始化
- 在main函数开始时要初始化
flags
- 例如前面代码中
google::ParseCommandLineFlags(&argc, &argv, true);
3.3.1.2.4 DECLARE_XXX
的使用
- 参考3.3.4.1.2 主文件的DECLARE_声明
3.3.1.2.4 执行可执行文件常用的特殊flag
--help
显示所有文件的所有flag,按文件、名称排序,显示flag名、默认值和帮助--helpshort
只显示执行文件中包含的flag,通常是 main() 所在文件--version
打印执行文件的版本信息
3.3.2 使用案例二,简单c++编译
摘自:gflags简明使用指南
3.3.2.1 案例代码
//test2.cc
#include <iostream>
#include <string>
#include <gflags/gflags.h> //gflags库的头文件
//else header file#define LOGDEFINE_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;
#endifstd::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;
}
3.3.2.2 编译方式
g++ test2.cc -o test2 -lgflags -lpthread
- 在编译的时候要加上-lgflags和-lpthread,因为gflags内部是需要POSIX线程库支持的,所以还需要加上-lpthread。
- 除了这两个外,也需要指定你安装的gflags的库文件(gcc选项:-L)和头文件(gcc选项:-I)。由于我把这两个放到了系统默认寻找的路径,所以在编译的时候没有显式指定。
3.3.3 使用案例三,运行可执行文件的参数设置
- 摘自:后端系统开发利器,gflags概述
3.3.3.1 案例代码
- simple_gflags.cpp
#include <iostream>
#include "gflags/gflags.h" // 定义gflags
DEFINE_bool(foo, false, "a simple gflags named foo, default value is flase, wuruilong, 2018-08-16");
DEFINE_int32(thread_num, 10, "thread number, default value is 10, wuruilong, 2018-08-16");int main(int argc, char **argv) {// 解析gflags参数,只需要1行代码google::ParseCommandLineFlags(&argc, &argv, true);// 使用gflagsif (FLAGS_foo) {std::cout << "foo is true" << std::endl;} else {std::cout << "foo is false" << std::endl;}// 使用gflagsint thread_num = FLAGS_thread_num;std::cout << "thread number:" << thread_num << std::endl;return 0;
}
3.3.3.2 编译方式
g++ simple_gflags.cpp -I./gflags-2.0/src -L./ -lgflags
3.3.3.3 运行方式
3.3.3.3.1 无参数
./a.out
输出:
foo is false
thread number:10
3.3.3.3.2 指定单个参数
./a.out -foo=true
输出:
foo is true
thread number:10
3.3.3.3.3 指定多个参数
./a.out -foo=true -thread_num=99
输出:
foo is true
thread number:99
3.3.4 使用案例四,配置gflags文件
- 摘自:后端系统开发利器,gflags概述
3.3.4.1 案例代码
- 下面是工程实践中使用gflags的例子,新开发的功能用bool类型的gflags包住,新旧代码互不干扰,在gflags开关没有打开时,就好像没有这段代码一样。从这个例子中可以看到gflags在多人开发模式中也能发挥很大的作用。
3.3.4.1.1 专门定义gflags的头文件gflags_def.cpp
#include "gflags/gflags.h"// 定义gflags
DEFINE_bool(add_new_feature_x, false, "x feature, gaojingying, 2018-08-16");
DEFINE_bool(add_new_featrue_y, false, "y feature, xiechao, 2018-08-16");
DEFINE_bool(fix_memory_leak_bug, false, "fix memory leak bug, xiechao, 2018-08-16");
DEFINE_bool(fix_cpu_high_bug, false, "fix cpu high bug, xiechao, 2018-08-16");
DEFINE_int32(thread_pool_worker_num, 10, "thread pool worker number, default value is 10, ligang, 2018-08-16");
DEFINE_string(server_ip, "127.0.0.1", "x server's ip address, gaojingying, 2018-08-16");
3.3.4.1.2 主文件的DECLARE_
声明
- 其他文件中使用gflags之前,需要先通过DECLARE_声明。
- main.cpp
#include <iostream>
#include <string>
#include <cstdio>
#include "gflags/gflags.h"// 声明gflags
DECLARE_bool(add_new_feature_x);
DECLARE_bool(add_new_featrue_y);
DECLARE_bool(fix_memory_leak_bug);
DECLARE_bool(fix_cpu_high_bug);
DECLARE_int32(thread_pool_worker_num);
DECLARE_string(server_ip);void Work(std::string &name) {name = "feature";// 启用x功能if (FLAGS_add_new_feature_x) {name += "_x";}// 启用y功能if (FLAGS_add_new_featrue_y) {name += "_y";}char *value = new char[100];snprintf(value, 100, "thread number: %d", FLAGS_thread_pool_worker_num);name = name + "," + value + "," + FLAGS_server_ip;// 留下消缺记录if (FLAGS_fix_memory_leak_bug) {delete []value;}
}int main(int argc, char **argv) {google::ParseCommandLineFlags(&argc, &argv, true);std::string name;Work(name);std::cout << name << std::endl;return 0;
}
3.3.4.2 编译方式
g++ main.cpp gflags_def.cpp –I./gflags-2.0/src -L./ -lgflags
3.3.4.3 运行
3.3.4.3.1 配置.gflags
文件
- gflags配置文件
demo_project.gflags
-add_new_feature_x=false
-add_new_featrue_y=true
-fix_memory_leak_bug=true
-fix_cpu_high_bug=false
-thread_pool_worker_num=20
-server_ip="127.0.0.1"
3.3.4.3.2 运行
3.3.4.3.2.1 不指定gflags配置文件
./a.out
输出:
feature,thread number: 10,127.0.0.1
3.3.4.3.2.2 指定gflags配置文件
./a.out --flagfile=demo_project.gflags
输出:
feature_x,thread number: 20,"127.0.0.1"
3.3.4.3.2.3 测试修改.gfalgs
演示
- 修改demo_project.gflags,关闭feature_x功能,启用feature_y功能:
./a.out --flagfile=demo_project.gflags
输出:
feature_y,thread number: 20,"127.0.0.1"
4 参考
- gflags简明使用指南
- 【多传感器融合定位】【ubuntu18.06配置环境】【ROS melodic】【g2o】【ceres】【Geographic】【gflags】【glog】【sophus】【GTSAM】【gtest】
- 后端系统开发利器,gflags概述
【gflags】【gflags实践】【gflags的学习使用记录】相关推荐
- gflags,glog,gtest学习
1. 引言 SLAM开发过程中常会用到gflags, glog, gtest 这三件套,gflags 是参数管理工具,glog 是日志打印工具,而 gtest是单元测试工具,下面对其进行学习和初步使用 ...
- Android Studio 学习实例记录-手电筒
Android Studio 学习实例记录-手电筒 刚安装好Android Studio3.1.2,上网搜了一个实例进行实践学习,仅用这篇文章来记录学习过程 MainActivity.java的源码来 ...
- 基于设计原理与理念和实践的ElasticSearch学习、ELK日志收集、网盘搜索引擎
目录 基于设计原理与理念和实践的ElasticSearch学习 一.ES基础入门 ElasticSearch是什么? ES优点: ES缺点: ElasticSearch应用场景 ElasticSear ...
- 效果广告点击率预估实践:在线学习
效果广告点击率预估实践:在线学习 原创 2016-03-24 腾讯大数据 腾讯大数据 1.引言 技术钻研如逆水行舟,不进则退.公司的广告业务发展非常迅猛,有目共睹,激烈的外部竞争和客户越来越高的期望, ...
- 奥卡姆剃刀是什么?机器学习实践中那些学习模型或者那些评估指标践行了这一理论?
奥卡姆剃刀是什么?机器学习实践中那些学习模型或者那些评估指标践行了这一理论? 奥卡姆剃刀:无无必要,勿增实体. 奥卡姆剃刀原理应用于模型选择时变为以下想法:在所有可能选择的模型中,能够很好地解释已知数 ...
- Hadoop学习全程记录——在Eclipse中运行第一个MapReduce程序
网友分享,拿来共享一下 这是Hadoop学习全程记录第2篇,在这篇里我将介绍一下如何在Eclipse下写第一个MapReduce程序. 新说明一下我的开发环境: 操作系统:在windows下使用wub ...
- python多分类混淆矩阵代码_深度学习自学记录(3)——两种多分类混淆矩阵的Python实现(含代码)...
深度学习自学记录(3)--两种多分类混淆矩阵的Python实现(含代码),矩阵,样本,模型,类别,真实 深度学习自学记录(3)--两种多分类混淆矩阵的Python实现(含代码) 深度学习自学记录(3) ...
- MySQL学习足迹记录01--SOURCE,SHOW
MySQL学习足迹记录01--SOURCE,SHOW MySQL学习足迹记录02--SELECT MySQL学习足迹记录03--ORDER BY,DESC MySQL学习足迹记录04--数据过滤--W ...
- Activiti 学习笔记记录(2016-8-31)
上一篇:Activiti 学习笔记记录(二) 导读:上一篇学习了bpmn 画图的常用图形标记.那如何用它们组成一个可用文件呢? 我们知道 bpmn 其实是一个xml 文件 转载于:https://ww ...
- 【深度学习】深度学习实验记录--自编码+分类器
深度学习课程记录 自编码分类器神经网络记录 1.Train the autoencoder by using unlabeled data 训练1(fail) 训练2(fail) 训练3(fail) ...
最新文章
- 何谓服务器托管服务?
- 学python的好处-python有什么优点
- advanced installer重新打包教程
- linux系统给jvm分配来多少内存
- caffe学习(1) ubunu 16.04+caffe+cuda8.0+opencv3.1安装
- 智能化服务器怎么调,怎么设置dns 智能dns设置方法 【图文】
- CCCC-GPLT L1-039. 古风排版 团体程序设计天梯赛
- Python字符串expandtabs()
- LeetCode 138. Copy List with Random Pointer
- 190226每日一句
- G-Dezender批量解密
- 【转】 【技巧 】 数学难题大揭秘:减少计算错误的技术
- java神雕侠侣1古墓情缘游戏攻略_《神雕侠侣》古墓派加点详解攻略
- 基于Netty实现分布式IM即时通讯开发
- 显示服务器人数已满,明日之后服务器人数已满怎么办 排队解决方法
- vue自适应布局(各种浏览器,分辨率)
- 永澄:认知层次模型-道术器用
- 从零开始创建一个Android主屏幕Widget
- Hexo+NexT 增加精品文章方法
- .NET的资源并不限于.resx文件(二)