Ubuntu22.04 - gflags的安装和使用

news/2025/2/22 5:02:19/

目录

  • gflags 介绍
  • gflags 安装
  • gflags 使用

gflags 介绍

gflags 是Google 开发的一个开源库,用于 C++应用程序中命令行参数的声明、定义和解析。gflags 库提供了一种简单的方式来添加、解析和文档化命令行标志(flags),使得程序可以根据不同的运行时配置进行调整。

它具有如下几个特点:

  • 易于使用: gflags 提供了一套简单直观的 API 来定义和解析命令行标志,使得开发者可以轻松地为应用程序添加新的参数。
  • 自动帮助和文档: gflags 可以自动生成每个标志的帮助信息和文档,这有助于用户理解如何使用程序及其参数。
  • 类型安全: gflags 支持多种数据类型的标志,包括布尔值、整数、字符串等,并且提供了类型检查和转换。
  • 多平台支持: gflags 可以在多种操作系统上使用,包括Windows、Linux和macOS
  • 可扩展性: gflags 允许开发者自定义标志的注册和解析逻辑,提供了强大的扩展性

gflags 安装

直接命令安装:apt-get install libgflags-dev
在这里插入图片描述
检测是否安装成功
在这里插入图片描述
在这里插入图片描述

gflags 使用

1.包含头文件:

#include <gflags/gflags.h>

2.定义参数:
利用gflag提供的宏定义来定义参数。该宏的3个参数分别为命令行参数名, 参数默认值, 参数的帮助信息

DEFINE_bool(reuse_addr, true, "是否开始网络地址重用选项");
DEFINE_int32(log_level, 1, "日志等级:1-DEBUG, 2-WARN, 3-ERROR");
DEFINE_string(log_file, "stdout", "日志输出位置设置,默认为标准输出");

3.访问参数
我们可以在程序中通过FLAGS_name像正常变量一样访问标志参数。比如在上面的例子中,我们可以通过 FLAGS_reuse_addr 和 FLAGS_log_level 变量来访问命令行参数。

4.初始化所有参数
当我们定义好参数后,需要告诉可执行程序去处理解析命令行传入的参数,使得FLAGS_*变量能得到正确赋值。我们需要在 main 函数中,调用下面的函数来解决命令行传入的所有参数。

google::ParseCommandLineFlags(&argc, &argv, true);
  • argc 和 argv 就是 main 的入口参数
  • 第三个参数被称为 remove_flags。如果它为true,表示ParseCommandLineFlags 会从 argv 中移除标识和它们的参数,相应减少 argc 的值。如果它为 false,ParseCommandLineFlags 会保留 argc 不变,但将会重新调整它们的顺序,使得标识再前面。

示例:

#include <iostream>
#include <gflags/gflags.h>DEFINE_string(ip,  "127.0.0.1", "这是服务器的监听IP地址, 格式: 127.0.0.1");
DEFINE_int32(port, 8080, "这是服务器的监听端口, 格式: 8080");
DEFINE_bool(debug_enable, true, "是否启用调试模式, 格式: true/false");int main(int argc, char* argv[])
{google::ParseCommandLineFlags(&argc, &argv, true);std::cout << FLAGS_ip << std::endl;std::cout << FLAGS_port << std::endl;std::cout << FLAGS_debug_enable << std::endl;return 0;
}

运行结果:
在这里插入图片描述
不用默认参数进行设置
在这里插入图片描述

一种场景: 命令行如果需要参数, 则要手敲参数, 如果参数很多, 就很麻烦了, 所以它还支持配置文件
5.配置文件的使用
配置文件的使用,其实就是为了让程序的运行参数配置更加标准化,不需要每次运行的时候都手动收入每个参数的数值,而是通过配置文件,一次编写,永久使用。需要注意的是,配置文件中选项名称必须与代码中定义的选项名称一致。
样例:

-reuse_addr=true
-log_level=3
-log_file=./log/main.log

在这里插入图片描述

运行结果:
在这里插入图片描述


http://www.ppmy.cn/news/1574060.html

相关文章

简单易懂,解析Go语言中的Channel管道

Channel 管道 1 初始化 可用var声明nil管道&#xff1b;用make初始化管道&#xff1b; len()&#xff1a; 缓冲区中元素个数&#xff0c; cap()&#xff1a; 缓冲区大小 //变量声明 var a chan int //使用make初始化 b : make(chan int) //不带缓冲区 c : make(chan stri…

关于uniApp的面试题及其答案解析

我的血液里流淌着战意&#xff01;力量与智慧指引着我&#xff01; 文章目录 1. 什么是uniApp&#xff1f;2. uniApp与原生小程序开发有什么区别&#xff1f;3. 如何使用uniApp实现条件编译&#xff1f;4. uniApp支持哪些平台&#xff0c;各有什么特点&#xff1f;5. 在uniApp中…

【Linux】【网络】Reactor补充+Libevent

【Linux】【网络】Reactor补充Libevent 1. 组件与类解析 1.1 句柄 IO框架库要处理的对象&#xff0c;即IO事件、信号和定时事件&#xff0c;统一称为事件源。一个事件源通常和一个句柄绑定在一起.句柄的作用是&#xff0c;当内核检测到就绪事件时&#xff0c;它将通过句柄来…

本地部署DeepSeek的硬件配置建议

本地部署DeepSeek的硬件配置需求因模型参数规模和部署工具不同而有所差异&#xff0c;以下是综合多个来源的详细要求&#xff1a; 1. 基础配置&#xff08;适用于7B参数模型&#xff09; 内存&#xff1a;最低8GB&#xff0c;推荐16GB及以上&#xff1b;若使用Ollama工具&…

【2025最新版】Chrome谷歌浏览器如何能恢复到之前的旧版本

背景 今天程序突然出了bug&#xff0c;无法自动测试了&#xff0c;显示Chrome版本不匹配&#xff0c;一看&#xff0c;Chrome居然在我已经关闭升级的情况下&#xff0c;又给我升级了&#xff0c;然后就悲剧了&#xff0c;我的代码不能用了。 于是&#xff0c;做了以下几步&…

创客匠人:知识服务还有未来吗?个人IP如何突围下半场的生死局?

我是老蒋&#xff0c;创客匠人创始人。 最近各种对个人IP赛道的预测&#xff0c;我听了不少&#xff0c;打开手机就是对个人IP的一顿喷和对行业未来的悲观猜想。 当所有人都在唱衰知识服务赛道时&#xff0c;我却在公司的后台数据看到令人振奋的消息&#xff1a; 2025年创客…

Linux sftp 使用详解

简介 SFTP&#xff08;安全文件传输协议&#xff09;是一种通过网络在计算机之间传输文件的安全方法。它是 SSH 协议的一部分&#xff0c;这意味着它在文件传输过程中提供加密通信。SFTP 通常用于安全文件管理、远程文件访问和远程文件编辑。 常用命令 sftp userhost&#xf…

Linux 固定 IP 地址和网关

Linux 固定 IP 地址和网关 查看 IP ifconfig ifconfig eth0 ip addr ip addr show eth0 查看网关 ip route show route -n netstat -rn 设置固定 IP // 配置静态IP文件/etc/network/interfaces $ vi /etc/network/interfacesauto eth0 iface eth0 inet static addre…