一. gflags 介绍

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

它具有如下几个特点:

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

官方文档:https://gflags.github.io/gflags/
代码仓库:https://github.com/gflags/gflags.git

二. gflags 安装

命令安装:

sudo apt-get install libgflags-dev

原码安装:

# 下载源码
git clone https://github.com/gflags/gflags.git
# 切换目录
cd gflags/
mkdir build
cd build/
# 生成 Makefile
cmake ..
# 编译代码
make
# 安装
sudo make install

在环境搭建中已经内置 gflags,这里不需要再次安装了。

三. gflags 使用

1. 头文件和链接库

在这里插入图片描述

#include <gflags/gflags.h>

程序编译时库的链接

-lgflags

2. 定义参数

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

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

gflags 支持定义多种类型的宏函数:

DEFINE_bool
DEFINE_int32
DEFINE_int64
DEFINE_uint64
DEFINE_double
DEFINE_string

3. 访问参数

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

4. 不同文件访问参数

如果想再另外一个文件访问当前文件的参数,以参数 FLAGS_reuse_addr 为例,我们可以使用宏 DECLARE_bool(reuse_addr) 来声明引入这个参数。其实这个宏就相当于做了 extern FLAGS_reuse_addr 定义外部链接属性。

5. 初始化所有参数

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

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

6. 运行参数设置

gflags 为我们提供了多种命令行设置参数的方式。

string 和 int 设置参数:

exec --log_file="./main.log"
exec -log_file="./main.log"
exec --log_file "./main.log"
exec -log_file "./main.log"

bool 设置参数:

exec --reuse_addr
exec --noreuse_addr
exec --reuse_addr=true
exec --reuse_addr=false

7. 配置文件的使用

配置文件的使用,其实就是为了让程序的运行参数配置更加标准化,不需要每次运行的时候都手动输入每个参数的数值,而是通过配置文件,一次编写,永久使用。

需要注意的是,配置文件中选项名称必须与代码中定义的选项名称一致,尤其需要注意的是配置文件中的字符串数据不需要使用双引号。

配置文件:

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

命令行执行

exec --flagfile=filename

8. 特殊参数标识

gflags 也默认为我们提供了几个特殊的标识。

--help # 显示文件中所有标识的帮助信息
--helpfull # 和-help一样,帮助信息更全面一些
--helpshort # 只显示当前执行文件里的标志
--helpxml # 以xml方式打印,方便处理
--version # 打印版本信息,由google::SetVersionString()设定
--flagfile=filename # 从文件filename中读取命令行参数

四. gflags 使用样例

1. 目录结构

gflags/
|-- main.cc
|-- main.conf
|-- makefile

2. 项目构建

# makefile
main: main.cc
	g++ -o $@ $^ -std=c++17 -lgflags

.PHONY: clean
clean:
	rm -f main

3. 样例编写

// main.cc
#include <iostream>
#include <string>
#include <gflags/gflags.h>

// 1.定义参数
DEFINE_bool(reuse_addr, true, "启动地址重用");
DEFINE_int32(listen_port, 8080, "服务器监听端口");
DEFINE_string(listen_ip, "0.0.0.0", "服务器监听IP");
DEFINE_double(pi, 3.1415926, "圆周率");

int main(int argc, char* argv[])
{
    // 2.解析参数
    google::ParseCommandLineFlags(&argc, &argv, true);
    
    // 3.使用参数
    std::cout << "reuse_addr: " << FLAGS_reuse_addr << std::endl;
    std::cout << "listen_port: " << FLAGS_listen_port << std::endl;
    std::cout << "listen_ip: " << FLAGS_listen_ip << std::endl;
    std::cout << "pi: " << FLAGS_pi << std::endl;

    return 0;
}

不使用命令行参数:
在这里插入图片描述

使用命令行参数:
在这里插入图片描述

4. 配置文件

# main.conf
-reuse_addr=true
-listen_ip=127.0.0.1
-listen_port=9090
-pi=3.1415926

在这里插入图片描述

Logo

火山引擎视频云技术社区,是面向 AI 音视频开发者的技术交流平台。这里汇聚源自抖音、豆包等亿级 DAU 产品的 RTC、直播、点播、AI 媒体处理、音视频互动技术,提供接入指南、最佳实践、性能调优、场景案例、Demo 代码、开源项目、白皮书和 API 文档。社区汇聚官方工程师与一线开发者,为 AI 视频通话、数字人、AI 视频处理等应用的开发与落地提供技术支持。

更多推荐