【第三方库】从编译到运行,轻松学会gflags库
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种函数来定义相应的变量类型:
DEFINE_bool:bool类型DEFINE_int32:int32_t整数类型DEFINE_int64:int64_t整数类型DEFINE_uint32:uint32_t整数类型DEFINE_uint64:uint64_t整数类型DEFINE_double:double浮点数类型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函数,就能解析命令行,即解析argc、argv参数。
`
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库的更多相关文章
- Qt第三方库QtAV--- ubuntu编译与运行
Qt第三方库QtAV--- ubuntu编译与运行 今天又要接触这个,把一些错误或者不足的地方重新补充下!!!由于前面一段时间,项目中需要借助QtAV接口进行视频播放,特此记录下整个配置过程.整个代码 ...
- 【视频开发】【计算机视觉】doppia编译之四:安装其他库、编译和运行doppia
(与本节内容无关///////////////////////////保存图片参数为--gui.save_all_screenshots true////////////////////) 在我们安 ...
- vs2008中xlslib与libxls库的编译及使用
C++用来操作Excel的方法很多,但是涉及到跨平台,同时又要对Excel的读写操作兼顾,而且免费的库,那应该是要用xlslib和libxls了.由于技术比较菜,折腾这个折腾了一个星期了.最开始是使用 ...
- VC6 下 libpng 库的编译与初步使用
VC6 下 libpng 库的编译与初步使用 目录 libong 库的介绍 VC6 下 libpng 的编译 下载 libpng 与 zlib 进行编译 得到 .lib 文件 初步使用 对 VC6 ...
- 动态库与静态库的学习 博主写的很好 静态库 编译的时候 需要加上 static 动态库编译ok运行不成功就按照文章中的方法修改
来源连接 http://www.cnblogs.com/skynet/p/3372855.html C++静态库与动态库 这次分享的宗旨是--让大家学会创建与使用静态库.动态库,知道静态库与动态库 ...
- json库的编译方法和vs2010中导入第三方库的方法
json库的编译方法和vs2010中导入第三方库的方法 一.去相应官网下载json.cpp文件 Jsoncpp下载:https://sourceforge.net/projects/jsoncpp/ ...
- DOS环境下含包并引用第三方jar的java程序的编译及运行
DOS环境下含包并引用第三方jar的java程序的编译及运行 1.程序目录机构 bin:class文件生成目录 lib:第三方jar包目录 src:源程序文件目录 2.程序代码: 3.程序编译 jav ...
- 【转】编译quickfast解析库(沪深level2行情转码库)
转自http://blog.csdn.net/hacode/article/details/7065889 编译quickfast解析库(沪深level2行情转码库) 目录(?)[-] 1 下载源代 ...
- C++之条形码,windows下zint库的编译及应用(二)
zint库是一个开源的第三方库,提供了生成条形码.二维码等功能.本文主要介绍zint库的生成及简单应用. 0windows下zint库的编译及应用(一) 工具/原料 vs2012 生成条形 ...
- Python语言、编译解释、动态库静态库、编译过程、头文件
学习Python这门语言首先要了解 什么是编译与解释,什么是连接,什么是动态库与静态库, 什么是编译: 编译就是先把高级语言设计的程序翻译成二进制的机器语言,然后CPU直接执行机器码就可以了.一把翻译 ...
随机推荐
- python判断素数
def slowsnail(num): count = num // 2 while count > 1: if num % count == 0: print('%d最大的约数是%d' % ( ...
- HTTP 和 HTTPS 之间除了安全性区别外,还有哪些区别
HTTP 和 HTTPS 是两种常见的网络协议,它们都是用于在浏览器和服务器之间传输数据的.但是,它们之间也有一些重要的区别,这些区别涉及到数据的安全性.传输性能.使用成本和搜索排名等方面.本文将从以 ...
- Codeforces Round #691 (Div. 2) D - Glass Half Spilled(DP)
题目 补下因实验漏掉的CF(还以为是晚上,没想到是下午开始).前三题过的很顺利,到D题时想了会发现数据很小爆搜貌似能过,就以为是道水题,交了一发T了,胡乱加了点剪枝还是T.逐渐意识到事情的严重性.考虑 ...
- 详细一些的vue生命周期
如果你和我一样,以前对vue生命周期的理解仅限于生命周期钩子,那么本文可以让我们更深入一层,理解vue在生命周期各个阶段所做的事,对我们对vue的理解和使用很有好处. (1)通过new Vue()创建 ...
- Java自定义ClassLoader实现插件类隔离加载
为什么需要类隔离加载 项目开发过程中,需要依赖不同版本的中间件依赖包,以适配不同的中间件服务端 如果这些中间件依赖包版本之间不能向下兼容,高版本依赖无法连接低版本的服务端,相反低版本依赖也无法连接高版 ...
- WinForm窗体间传值的方法
窗体间传递数据,无论是父窗体操作子窗体,还是子窗体操作符窗体,有以下几种方式: 1.公共静态变量:2.使用共有属性:3.使用委托与事件:4.通过构造函数把主窗体传递到从窗体中: 一.通过静态变量特点: ...
- 快速入门:使用 .NET Aspire 组件实现缓存
前言 云原生应用程序通常需要各种类型的可扩展缓存解决方案来提高性能..NET Aspire 组件简化了连接到流行的缓存服务(例如 Redis)的过程,今天小编就为大家简单介绍一下如何使用 .NET A ...
- 在 JMeter 中使用 JSON 提取器提取特定条件下的值
当你需要在 JMeter 中对接收到的 JSON 响应进行处理时,JSON 提取器是一个非常有用的工具.在本文中,我们将讨论如何使用 JSON 提取器来提取特定条件下的值,以满足你的需求. 问题描述 ...
- 文档理解的新时代:LayOutLM模型的全方位解读
一.引言 在现代文档处理和信息提取领域,机器学习模型的作用日益凸显.特别是在自然语言处理(NLP)技术快速发展的背景下,如何让机器更加精准地理解和处理复杂文档成为了一个挑战.文档不仅包含文本信息,还包 ...
- 使用jvm工具排查系统问题
java-jvm-tool Jstatd 远程连接(推荐) 不用重启项目 远程机配置 [demo@localhost jvmtest]$ vi jstatd.all.policy# 内容grant c ...