首页 > 其他分享 >【第三方库】从编译到运行,轻松学会gflags库

【第三方库】从编译到运行,轻松学会gflags库

时间:2023-09-18 22:35:49浏览次数:34  
标签:gflags default age 编译 main type 第三方 DEFINE

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,default,age,编译,main,type,第三方,DEFINE
From: https://www.cnblogs.com/RioTian/p/17713275.html

相关文章

  • window下编译openssl
    BuildingOpenSSL1.1.1(b)Notes(Windows)·GitHub nasm下载地址:https://www.nasm.us/pub/nasm/releasebuilds/2.16.01/win64/nasm-2.16.01-installer-x64.exeopenssl下载地址:https://codeload.github.com/openssl/openssl/zip/refs/heads/masterperl下载地址:ht......
  • 解决 ChatGLM.CPP+clBlast 编译错误(也适用于SD.CPP)
    首先安装OpenCL和clblast:vcpkginstallopenclclblast下载GitHub上的源码:gitclone--recurse-submoduleshttps://github.com/li-plus/chatglm.cppcdchatglm.cpp这个项目GGML子仓库中,third_party/ggml/src/CMakeList.txt有个错误。打开并找到178-183行: find_......
  • VS2015 QT5.9.4 联合编译报错:提示找不到rc.exe
    解决方案:参考链接1、在C:\ProgramFiles(x86)\WindowsKits\10\bin\10.0.19041.0\x64路径下,找到rc.exe和rcdll.dll两个文件,并复制;2、粘贴到MicrosoftVisualStudio14.0\VC\bin对应目录下;3、重新编译运行程序即可。......
  • VCSA证书过期时当存在第三方的插件或解决方案证书更新报错问题处理
    VCSA证书过期时当存在第三方的解决方案证书更新报错问题处理  测试环境存在Zerto时已经通过验证TaskSteps:SSHtoPSCRuntheCertificateManagertoolfrom /usr/lib/vmware-vmca/bin/certificate-managerSelecttoReplaceMachineSSLCertificatewithCustomSig......
  • 用iframe把Grafana Dashboard嵌入第三方系统
    用Grafana可以很容易地创建Dashboard,并且后期修改和更新很方便,由于它的易用性和灵活性很适合用来做系统和生产的监控。但是Grafana的UI设计似乎对普通用户不是很友好,如果让用户直接登录Grafana去搜索浏览Dashboad不是很合适。由此自然就产生了把Grafana嵌入第三方系统的需求。重......
  • 编译python扩展模块:-ltensorflow_framework
    参考:https://blog.csdn.net/u012947309/article/details/116736684  =======================================       =======================================......
  • 使用GNU编译器套件链接库
    1、当前目录/home/xuanmiao/Demo/LSPT/Test创建文件prime.h和prime.cprime.hintisprime(longintnumber);prime.cintisprime(longintnumber){longintj;intprime=1;/*Testifthenumberisdivisible,starting*from2*/for(j=2;......
  • • 编译工具链
    主要内容:编译工具链MakefileGccClangcmakeELF编译:编译过程就是把预处理完的文件进行一系列词法分析、语法分析、语义分析以及优化后生成相应的汇编代码文件。编译工具链简介编译工具链是指用于将源代码编译成可执行文件的一组工具集合。它包括编译器、汇编器、链接器等工具,通常......
  • 编译和解释的区别
    编译更偏向于翻译,也就是写好一个程序系统直接全部翻译好后,给计算机,计算机直接运行生成一个class来执行文件,好处是速度快,坏处是不便于更新,如果代码有什么变动就需要重新再编译一遍解释性:我理解为逐句翻译给电脑,逐句运行,逐句解释,坏处是速度比较慢,但是如果代码有什么更新,之前解释过......
  • 微信开放平台第三方开发,实现代小程序备案申请
    大家好,我是小悟微信小程序备案整体流程总共分为五个环节:备案信息填写、平台初审、工信部短信核验、通管局审核和备案成功。服务商可以代小程序发起备案申请。在申请小程序备案之前,需要确保小程序基本信息已填写完成、小程序至少存在一个审核通过的类目。备案操作过程如下。将备案信......