Gflags的使用

目录

1. gflags 安装

2. gflags 使用

2.1 基本使用方法

2.2 基本使用实例

2.3 放入配置文件中

3. 融入cmakelists中使用


在实际工程代码开发中,发现gflags很好用,可以在运行

1. gflags 安装

gflags的安装使用apt-get install命令安装即可

sudo apt-get install libgflags-dev
sudo apt-get install libgoogle-glog-dev
sudo apt-get install libgtest-dev

当然也可以使用源码安装,我通过命令安装就足够使用了,源码安装就不再赘述。

2. gflags 使用

2.1 基本使用方法

首先看定义方法,在代码中增加下面几类定义,可以在程序中使用相应的flag:

// gflags定义类型	描述
DEFINE_bool(is_test, false, "test for bool");   // bool位整型
DEFINE_int32(int32_test, 0, "test for int32");	// 32位整型
DEFINE_int64(int64_test, -1, "test for int64");	// 64位整型
DEFINE_uint64(uint64_test, 0, "test for uint64");	// 无符号64位整型
DEFINE_double(double_test, 0.1, "test for double");	// 浮点类型
DEFINE_string(string_test, "test", "test for string");	// C++ string类型

gflag中可以定义上述六类类型的flag,以第一个bool类型的定义为例,第一个变量is_test就是flag的名称,第二个变量false是该flag的默认值,第三个变量“test for bool”是对is_test这个bool类型的flag的解释说明,上述三个量在自己使用的时候根据需要修改。

在程序中使用定义的flag之前,首先需要加上如下代码

gflags::ParseCommandLineFlags(&argc, &argv, true);

这行代码用来对命令行中输入的flag值进行拆解,前两个变量分别是命令行输入的参数个数,和参数数组,第三个变量true,false决定了是否在读入flag后,恢复命令行的参数和参数列表。个人认为这里true,false都不影响使用。

在程序结束使用flag之前,需要加入如下代码

gflags::ShutDownCommandLineFlags();

2.2 基本使用实例

定义好flag之后,使用的时候在定义的变量之前加上FLAGS_,如is_test使用时变为FLAGS_is_test。

#include <iostream>
#include <gflags/gflags.h>
using namespace std;// gflags定义类型	描述
DEFINE_bool(is_test, false, "test for bool");   // bool位整型
DEFINE_int32(int32_test, 0, "test for int32");	// 32位整型
DEFINE_int64(int64_test, -1, "test for int64");	// 64位整型
DEFINE_uint64(uint64_test, 0, "test for uint64");	// 无符号64位整型
DEFINE_double(double_test, 0.1, "test for double");	// 浮点类型
DEFINE_string(string_test, "test", "test for string");	// C++ string类型// 定义为全局变量,类似于extern
DECLARE_bool(is_test);int main(int argc, char **argv){gflags::ParseCommandLineFlags(&argc, &argv, true);if(FLAGS_is_test){cout << "FLAGS_is_test is true." << endl;}cout << FLAGS_string_test << endl;gflags::ShutDownCommandLineFlags();return 0;
}

编译时注意需要指定gflag的库

g++ Gflags.cpp -lgflags

编译完成后,运行可执行文件时,可以修改对应flag的值

./a.out -is_test=true -string_test="try string test"

运行结果如下:

FLAGS_is_test is true.
try string test

2.3 放入配置文件中

工程上对于配置文件的使用比较频繁,如果定义的flag较多,可以借助配置文件来定义。gflag对这个配置文件的变量名有明确的规定,用flagfile,配置的格式和在命令行中一致。

#flag_config.txt
-is_test=True 
-string_test="try string test"

运行时指定flagfile变量

./a.out -flagfile=flag_config.txt

3. 融入cmakelists中使用

上述编译的时候,要制定gflags库,那么在使用cmakelists的时候,就要对应的增加库

cmake_minimum_required(VERSION 3.10)
project(test)# 设置C++标准为C++11
set(CMAKE_CXX_STANDARD 11)# 查找gflags库
find_package(gflags REQUIRED)add_executable(test Gflags.cpp)# 链接gflags库到你的项目
target_link_libraries(test gflags)

编译执行即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/857385.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【SCAU数据挖掘】数据挖掘期末总复习题库简答题及解析——下

1.从某超市顾客中随机抽取5名&#xff0c;他们的购物篮数据的二元0/1表示如下&#xff1a; 顾客号 面包 牛奶 尿布 啤酒 鸡蛋 可乐 1 1 1 0 0 0 0 2 1 0 1 1 1 0 3 0 1 1 1 0 1 4 1 1 1 1 0 0 5 1 1 1 0 0 1 某学生依据这些数据做…

Spring Security6 设置免登录接口地址

1. 在SecurityFilterChain中设置免登录接口地址。如果定义了多个SecurityFilterChain&#xff0c;并且前面的SecurityFilterChain里使用了anyRequest().authenticated()&#xff0c;后面的免登录可能会失效。 Configuration EnableWebSecurity public class SecurityConfig {B…

Linux常用命令(16)—awk命令(有相关截图)

写在前面&#xff1a; 最近在学习Linux命令&#xff0c;记录一下学习Linux常用命令的过程&#xff0c;方便以后复习。仅供参考&#xff0c;若有不当的地方&#xff0c;恳请指正。如果对你有帮助&#xff0c;欢迎点赞&#xff0c;关注&#xff0c;收藏&#xff0c;评论&#xf…

tessy 编译错误总结

目录 1,tessy 单元测试 TDE 界面 数据无法填充:the test object interface is incomplete 2,tessy 编译报错:单元测试时,普通桩函数内容相关异常场景 3,tessy 编译报错:模块分析后 头文件 找不到 4,tessy 集成测试:SCE界面component函数太多 5,tessy 编译报错:函…

Java 10新特性介绍

Java 10是Java平台的一个重要更新&#xff0c;它引入了多项新特性和改进。以下是一些主要的新特性&#xff1a; 局部变量类型推断&#xff08;var关键字&#xff09; Java 10允许使用var关键字来声明局部变量&#xff0c;而无需显式指定变量的类型。编译器会根据变量赋值的上下…

non_blocking=True 与 torch.cuda.synchronize()

需要注意的是&#xff1a;GPU和CPU之间是异步执行的&#xff0c;CPU向GPU下达指令以后会立刻执行之后的代码&#xff0c;CPU不会等待GPU执行完成 一、non_blockingTrue 目的&#xff1a;压缩gpu的效果&#xff0c;避免CPU与GPU设备数据传输时间开销带来的计算效率低下 在 P…

Android获取控件宽高的几种方式

第一种方式&#xff1a;在需要时获取&#xff0c;如控件点击时再获取 button.setOnClickListener(new View.OnClickListener() { Override public void onClick(View v) { getTextWidthAndHeight(); } }); 第二种方式&#xff1a;重写onWindowFocusChanged()方法 Overr…

【SQL】varchar 与 char 的区别

在 SQL 中&#xff0c;VARCHAR 和 CHAR 是用于存储字符串类型数据的两种数据类型&#xff0c;但它们在存储方式和性能上有显著的区别。 CHAR 定义: CHAR 是一种固定长度的字符串数据类型。长度: 你需要在定义表结构时指定长度&#xff0c;例如 CHAR(10)。存储方式: 无论实际存…

【机器学习】机器学习赋能交通出行:智能化实践与创新应用探索

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀目录 &#x1f4d2;1. 引言&#x1f4d9;2. 交通流量预测与优化&#x1f31e;数据准备&#x1f319;模型训练与预测⭐评估模型与优化 &#x…

jsonpath_解析例子代码

# _*_ coding : utf-8 _*_ # Time : 2023-11-05 13:23 # Author : haowen # File : jsonpath_解析_淘票票 # Project : py练习 import urllib.request url https://dianying.taobao.com/cityAction.json?activityId&_ksTS1699161894273_112&jsoncallbackjsonp113&…

网页抓取单词关联

在当今数字化的时代&#xff0c;数据的获取与处理成为了众多企业和开发者关注的焦点。API 服务的出现&#xff0c;为我们打开了高效、便捷获取和利用数据的新大门。接下来&#xff0c;为您介绍几款独具特色的 API 服务&#xff0c;它们将为您的业务和开发工作带来前所未有的便利…

ABB机械手3HAC024518-001电机振动过大维修方案

【ABB机械臂伺服电机维修方案】 1. 更换轴承 如果检查发现轴承磨损&#xff0c;我们需要更换新的轴承。请选择与原轴承型号相同的产品&#xff0c;以确保电机正常运行。 2. 重新平衡转子 如果ABB机械手3HAC024518-001电机转子不平衡&#xff0c;我们需要重新平衡转子。这可以通…

棉花叶子病害分类数据集3601张6类别

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;3601 分类类别数&#xff1a;6 类别名称:[“aphids”,“army_worm”,“bact…

小熊文件工具箱免费版

小熊文件工具箱是一款基于本地离线操作的一系列工具的合集&#xff0c;最大特点是各种批量任务的执行&#xff0c;包含了智能证件照&#xff0c;自动抠图&#xff0c;直播录制&#xff0c;九宫格切图&#xff0c;拼图&#xff0c;视频格式转换及压缩&#xff0c;zip压缩解压缩&…

Python一文轻松搞定正则匹配

一、前言 日常工作中&#xff0c;不可避免需要进行文件及内容的查找&#xff0c;替换操作&#xff0c;python的正则匹配无疑是专门针对改场景而出现的&#xff0c;灵活地运用可以极大地提高效率&#xff0c;下图是本文内容概览。 ​ 二、正则表达式符号 对于所有的正则匹配表达…

C++中的抽象类和纯虚函数。

在C中&#xff0c;抽象类和纯虚函数是面向对象编程的两个重要概念&#xff0c;它们允许我们定义接口和强制派生类实现特定的行为。 抽象类&#xff08;Abstract Class&#xff09; 抽象类是一种特殊的类&#xff0c;它不能被实例化&#xff08;即不能创建抽象类的对象&#x…

MySQL的DML语句

文章目录 ☃️概述☃️DML☃️添加数据☃️更新和删除数据☃️DML的重要性 ☃️概述 MySQL 通用语法分类 ● DDL: 数据定义语言&#xff0c;用来 定义数据库对象&#xff08;数据库、表、字段&#xff09; ● DML: 数据操作语言&#xff0c;用来对数据库表中的数据进行增删改 …

佳能打印机问题解决

佳能家用打印机加墨水但是墨盒不到中间来怎么处理 您好亲&#xff0c; 一、真堵原因&#xff1a; 1、打印间隔时间太长&#xff0c;造成打印头干沽结皮 。 每15天开动打印机打印一张全色文档。 2、封条未撕开&#xff0c;空气不进入。将黄色封条撕开重装墨盒。 3、经长时间…

Android系统揭秘(一)-Activity启动流程(上)

public ActivityResult execStartActivity( Context who, IBinder contextThread, IBinder token, Activity target, Intent intent, int requestCode, Bundle options) { IApplicationThread whoThread (IApplicationThread) contextThread; … try { … int result …

TCP 和 UDP 可以同时绑定相同的端口吗?

在网络编程中&#xff0c;TCP和UDP都可以绑定到同一个端口上进行通信。TCP和UDP是OSI模型中的传输层协议&#xff0c;它们分别使用不同的端口号来区分不同的应用程序或服务。 TCP&#xff08;Transmission Control Protocol&#xff09;提供了面向连接的、可靠的传输服务&…