Google gflags usage on windows

来源:互联网 发布:通达信选股软件 编辑:程序博客网 时间:2024/05/06 15:26

gflags 是 google 的开源项目,用来解析程序的命令行输入参数。传统的方法是手工解析argv参数,或者使用getopt函数。两种方法都比较费劲。使用Google gflags可以大大简化命令行参数处理。下面主要记录如何在windows下利用CMake编译gflags,并用CMakeLists来使用gflags,以及基本的使用方法。


Complie gflags By CMake

在github上下载源代码,https://github.com/gflags/gflags,online帮助文档。

使用CMake编译gflags。这里要注意的是,后面我将在glog中使用gflags,需要将gflags在google namespace下编译。所以需要设置环境变量GFLAGS_NAMESPACE为google( -DGFLAGS_NAMESPACE=google )。详情参考stackoverflow。

编译好之后,在build文件夹下有vs工程文件gflags.sln,直接打开生成就行了。build目录就有了lib和include文件夹,里面分别包含了需要的库文件和头文件。

写CMakeLists

这里是参考gfalgs的使用手册。直接贴出我的CMakeLists好了。
也自己新建VS工程,然后手工指定include目录和lib目录。

cmake_minimum_required(VERSION 3.0)project(GflagsTest)find_package (gflags REQUIRED)include_directories (${gflags_INCLUDE_DIR})add_executable (GflagsTest GflagsTest.cpp)target_link_libraries (GflagsTest gflags)

使用方法

#include <iostream>#include <string>#include <gflags/gflags.h>DEFINE_bool( big_menu, true, "Include 'advanced' options in the menu listing" );DEFINE_string( languages, "english,french,german",  "comma-separated list of languages to offer in the 'lang' menu" );using std::cout;using std::endl;int main(int argc, char *argv[]) {  google::ParseCommandLineFlags(&argc, &argv, true);  if ( FLAGS_big_menu ){     std::cout << "FLAGS_big_menu is true" << std::endl;  }  else{     std::cout << "FLAGS_big_menu is false" << std::endl;  }  std::cout << FLAGS_languages << std::endl;  std::cout << FLAGS_big_menu << std::endl;  if ( FLAGS_languages.find( "german" ) != std::string::npos ){     std::cout << FLAGS_languages << std::endl;  }  return 0;}

还是先贴代码吧。
然后再来说一下怎么使用gflags来解析命令行参数。
gflags中定义了一些固定的类型,可以按照这些类型来声明和输入参数。常用的bool,int,double, string类型都支持。

DEFINE_bool: boolean
DEFINE_int32: 32-bit integer
DEFINE_int64: 64-bit integer
DEFINE_uint64: unsigned 64-bit integer
DEFINE_double: double
DEFINE_string: C++ string

这些类型的定义都在头文件gflags/gflags.h的最下面。感兴趣可以看看。
使用的时候所有的DEFINE_* 宏都需要三个参数,分别是flag的名称,默认值和说明。

在程序中,首先包含头文件gflags/gflags.h,然后定义需要使用的flag。

DEFINE_bool( big_menu, true, "Include 'advanced' options in the menu listing" );DEFINE_string( languages, "english,french,german",  "comma-separated list of languages to offer in the 'lang' menu" );

比如这里定义了一个bool和一个string类型的flag,其中bool型的flag名称为big_menu,默认值为true;string类型的flag名称为languages,,默认值为”english,french,german”。

定义好自己要使用的flag之后,在使用的时候只用一行代码 google::ParseCommandLineFlags(&argc, &argv, true) 就够了,通常这行代码是在main函数内最前边。

对于定义的flag,会生成对应的变量FLAGS_flag。然后我们就可以像使用正常定义的变量来使用FLAGS_flag了。比如对于定义的big_menu,会生成一个FLAGS_big_menu的bool型变量,我们可以根据这个变量来确定程序的执行流程。在程序中也可以改变它的值。

对于定义的languages,也会生成一个FLAGS_languages的字符串string类型的变量。


命令行输入格式

下面就是最后的输入命令行参数了。输入是有一定格式要求的。
对于bool类型的big_menu,输入时有几种方式:

GflagsTest --big_menuGflagsTest --big_menu=trueGflagsTest --nobig_menuGflagsTest --big_menu=false

其中前面两种是令big_menu为true,后面两种令其为false。

同样对于string类型的languages也有几种方式:

GflagsTest --languages="chinese,japanese,korean"GflagsTest -languages="chinese,japanese,korean"GflagsTest --languages "chinese,japanese,korean"GflagsTest -languages "chinese,japanese,korean"

为了统一,推荐使用一样的格式, –variable=value for non-boolean flags, and –variable/–novariable for boolean flags。

比如:
GflagsTest -languages=”chinese,french,german” -big_menu=false

参考

https://gflags.github.io/gflags/

0 0
原创粉丝点击