gflags是Google开源的一个库,可以很方便地定义一些全局变量,并且可以从命令行设置他们的值,广泛应用于各个项目中以及自己平时的开发中。本期参考gflags的官方文档,简单直接介绍下怎么使用这个库。

构建依赖环境

使用 VcPkg 即可

cmake_minimum_required(VERSION 2.8.12)
project(gflags_demo) add_subdirectory(gflags) # 添加子目录 add_executable(main main.cc) # 生成目标文件 main
target_link_libraries(main gflags::gflags) # 链接到 gflags库

经过上述步骤,下面我们就可以在main.cc文件中,写gflags的demo。

tutorials

gflags定义的是全局变量,目前支持以下7种函数来定义相应的变量类型:

  1. DEFINE_boolbool类型

  2. DEFINE_int32int32_t 整数类型

  3. DEFINE_int64int64_t 整数类型

  4. DEFINE_uint32uint32_t整数类型

  5. DEFINE_uint64uint64_t整数类型

  6. DEFINE_doubledouble浮点数类型

  7. DEFINE_string: STL的std::string类型

上述的DEFINE_XXX函数,本质上是宏,接口类型一致:DEFINE_XXX(name, val, txt)

  • name:变量名

  • val:变量的默认值

  • txt:是这个变量的提示信息,在使用--help时会显示出来

下面通过一个简单的demo来介绍gflags的使用。

在下面的demo中,使用DEFINE_XXX函数定义了三个类型的全局变量:

#include <gflags/gflags.h>
#include <iostream> DEFINE_bool(big_menu, 
            true, 
            "Include 'advance' option in the menu listing");
DEFINE_string(languages, 
              "english, french, chinese", 
              "comma-separated list of languages to offer in the 'lang' menu");
DEFINE_uint32(age, 
              10, 
              "age");

那怎么在程序中使用他们呢?

在程序中使用DEFINE_XXX函数定义的变量时,需要在每个变量前加上FLAGS_前缀。

比如,下面输出三个变量的默认值:

int main(int argc, char ** argv)
{
cout << std::boolalpha; // 为了让bool类型输出true/false,而不是 1/0 cout << "big_menu: " << FLAGS_big_menu << '\n'
<< "languages: " << FLAGS_languages << '\n'
<< "age: " << FLAGS_age << '\n'; return 0;
}

编译运行

$ cd build && cmake .. && make  # 进入 demo/build 目录,再编译
$./main 
big_menu: true
languages: english, french, chinese
age: 10

从结果可以看出,输出的就是DEFINE_XXX函数中设置的默认值。

那这些变量的值,怎么通过命令行设置?

只需要在main函数后,添加::gflags::ParseCommandLineFlags函数,就能解析命令行,即解析argcargv参数。

`

int main(int argc, char** argv) {
    ::gflags::ParseCommandLineFlags(&argc, &argv, true);
    std::cout<<std::boolalpha;     std::cout<<"big_menu: "<<FLAGS_big_menu<<'\n'
             <<"languages: "<<FLAGS_languages<<'\n'
             <<"age: "<<FLAGS_age<<std::endl;     return 0;
}

此时,重新编译运行:

$  make 
$ ./main -age 100 -languages "123456"
big_menu: true
languages: 123456
age: 100

对于命令行输入格式,gflags提供了四种格式,以age变量为例:

  • ./main -age 100

  • ./main -ag=100

  • ./main --age 100

  • ./main --age=100

如果这个main.cc程序不是你写的,但是你知道他使用了gflags库,想看看它定义了哪些变量,则可以使用--helpshort选项,就会显示这些变量的相关信息:

$ ./main --helpshort
main: Warning: SetUsageMessage() never called Flags from /Users/self_study/Cpp/OpenSource/demo/main.cc:
  -age (age) type: uint32 default: 10
  -big_menu (Include 'advance' option in the menu listing) type: bool
    default: true
  -languages (comma-separated list of languages to offer in the 'lang' menu)
    type: string default: "english, french, chinese"

如果某个项目中使用了 gflags  定义了很多全局变量,分布在不同的文件中,你可以使用--helpfull选项来查看这些变量:

% ./main --helpfull 
main: Warning: SetUsageMessage() never called   Flags from /Users/self_study/Cpp/OpenSource/demo/gflags/src/gflags.cc:
    -flagfile (load flags from file) type: string default: ""
    -fromenv (set flags from the environment [use 'export FLAGS_flag1=value'])
      type: string default: ""
    -tryfromenv (set flags from the environment if present) type: string
      default: ""
    -undefok (comma-separated list of flag names that it is okay to specify on
      the command line even if the program does not define a flag with that
      name.  IMPORTANT: flags in this list that have arguments MUST use the
      flag=value format) type: string default: ""   Flags from /Users/self_study/Cpp/OpenSource/demo/gflags/src/gflags_completions.cc:
    -tab_completion_columns (Number of columns to use in output for tab
      completion) type: int32 default: 80
    -tab_completion_word (If non-empty, HandleCommandLineCompletions() will
      hijack the process and attempt to do bash-style command line flag
      completion on this value.) type: string default: ""   Flags from /Users/self_study/Cpp/OpenSource/demo/gflags/src/gflags_reporting.cc:
    -help (show help on all flags [tip: all flags can have two dashes])
      type: bool default: false
    -helpfull (show help on all flags -- same as -help) type: bool
      default: false currently: true
    -helpmatch (show help on modules whose name contains the specified substr)
      type: string default: ""
    -helpon (show help on the modules named by this flag value) type: string
      default: ""
    -helppackage (show help on all modules in the main package) type: bool
      default: false
    -helpshort (show help on only the main module for this program) type: bool
      default: false
    -helpxml (produce an xml version of help) type: bool default: false
    -version (show version and build info and exit) type: bool default: false   Flags from /Users/self_study/Cpp/OpenSource/demo/main.cc:
    -age (age) type: uint32 default: 10
    -big_menu (Include 'advance' option in the menu listing) type: bool
      default: true
    -languages (comma-separated list of languages to offer in the 'lang' menu)
      type: string default: "english, french, chinese"

好嘞,gflags库的使用就介绍到这。更多细节,自行阅读官方文档和源码。

【第三方库】从编译到运行,轻松学会gflags库的更多相关文章

  1. Qt第三方库QtAV--- ubuntu编译与运行

    Qt第三方库QtAV--- ubuntu编译与运行 今天又要接触这个,把一些错误或者不足的地方重新补充下!!!由于前面一段时间,项目中需要借助QtAV接口进行视频播放,特此记录下整个配置过程.整个代码 ...

  2. 【视频开发】【计算机视觉】doppia编译之四:安装其他库、编译和运行doppia

    (与本节内容无关///////////////////////////保存图片参数为--gui.save_all_screenshots true////////////////////)  在我们安 ...

  3. vs2008中xlslib与libxls库的编译及使用

    C++用来操作Excel的方法很多,但是涉及到跨平台,同时又要对Excel的读写操作兼顾,而且免费的库,那应该是要用xlslib和libxls了.由于技术比较菜,折腾这个折腾了一个星期了.最开始是使用 ...

  4. VC6 下 libpng 库的编译与初步使用

      VC6 下 libpng 库的编译与初步使用 目录 libong 库的介绍 VC6 下 libpng 的编译 下载 libpng 与 zlib 进行编译 得到 .lib 文件 初步使用 对 VC6 ...

  5. 动态库与静态库的学习 博主写的很好 静态库 编译的时候 需要加上 static 动态库编译ok运行不成功就按照文章中的方法修改

    来源连接   http://www.cnblogs.com/skynet/p/3372855.html C++静态库与动态库 这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库 ...

  6. json库的编译方法和vs2010中导入第三方库的方法

    json库的编译方法和vs2010中导入第三方库的方法 一.去相应官网下载json.cpp文件 Jsoncpp下载:https://sourceforge.net/projects/jsoncpp/  ...

  7. DOS环境下含包并引用第三方jar的java程序的编译及运行

    DOS环境下含包并引用第三方jar的java程序的编译及运行 1.程序目录机构 bin:class文件生成目录 lib:第三方jar包目录 src:源程序文件目录 2.程序代码: 3.程序编译 jav ...

  8. 【转】编译quickfast解析库(沪深level2行情转码库)

     转自http://blog.csdn.net/hacode/article/details/7065889 编译quickfast解析库(沪深level2行情转码库) 目录(?)[-] 1 下载源代 ...

  9. C++之条形码,windows下zint库的编译及应用(二)

    zint库是一个开源的第三方库,提供了生成条形码.二维码等功能.本文主要介绍zint库的生成及简单应用.   0windows下zint库的编译及应用(一)   工具/原料   vs2012 生成条形 ...

  10. Python语言、编译解释、动态库静态库、编译过程、头文件

    学习Python这门语言首先要了解 什么是编译与解释,什么是连接,什么是动态库与静态库, 什么是编译: 编译就是先把高级语言设计的程序翻译成二进制的机器语言,然后CPU直接执行机器码就可以了.一把翻译 ...

随机推荐

  1. 离散傅里叶变换DFT的应用

    目录 一维DFT 1 DFT的相关内容 2 DFT计算结果验证 3 DFT的时频曲线分析 4 DFT的应用 二维DFT 1 DFT在图像处理时的相关内容 2 DFT滤波应用 一维DFT 1 DFT的相 ...

  2. npm install 报-4048错误

    报错原因: 有缓存 权限不够 有三种解决方法: 第一种:找到.npmrc文件并删除 在 C:\Users\自己用户的文件夹\ 下找到 .npmrc 文件并删除 注意:这个文件是隐藏的,需要显示隐藏才能 ...

  3. 开源 Serverless 框架 Laf 性能优化实践

    介绍 Laf 是一个完全开源的 Serverless 框架,Laf 的 Node.js 运行时容器 (以下简称为 Runtime) 是 Laf 的函数执行环境,依托于 Express.js 框架.采用 ...

  4. 理解 Paimon changelog producer

    介绍 目的 Chaneglog producer 的主要目的是为了在 Paimon 表上产生流读的 changelog, 所以如果只是批读的表是可以不用设置 Chaneglog producer 的. ...

  5. 华企盾DSC由于半透明软件设置了需要管理员权限打开导致半透明打不开加密文件

    解决方法: 1.右键该应用程序->属性->兼容性,去掉[以管理员权限运行此程序] 2.也可以打开控制面板->系统和安全->用户账户控制设置调至最低

  6. 笔记本安装linux

    下载 桌面版 Ubuntu 镜像 服务器版 Ubuntu 镜像 使用 Balena Etcher 制作系统安装盘 (1)官方网站下载: 点我下载 (2)下载完毕软件之后,打开软件,选择我们下载好的系统 ...

  7. 【scikit-learn基础】--『监督学习』之 决策树回归

    决策树算法是一种既可以用于分类,也可以用于回归的算法. 决策树回归是通过对输入特征的不断划分来建立一棵决策树,每一步划分都基于当前数据集的最优划分特征.它的目标是最小化总体误差或最大化预测精度,其构建 ...

  8. 2023.3 Idea配置Tomcat环境

    tomcat配置 下载tomcat 先到官网(按住Ctrl再左键点击直接打开官网)下载64位的tomcat,网速慢就用魔法下 创建项目.模块 打开idea(我用的是最新的idea的专业版,ui有点变化 ...

  9. Python——第一章:if语法规则

    if语句的语法规则: ======第一种======        if 条件:            代码        如果条件成立就执行代码        如果不成立, 就不执行 案例1: mo ...

  10. 直击云栖|践行数据化运维,云掣重新解读MSP

    2020年云栖大会百城汇·杭州站,云掣MSP专场圆满落幕! 本次云栖大会·云掣MSP专场以"数据智能,智能运维"为主题,主要聚焦企业云化转型演进趋势,云上运维全景监控以及云原生云环 ...