您的位置:首页 > 编程语言 > Go语言

Google gflags usage on windows

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

Complie gflags By CMake

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

使用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_menu
GflagsTest --big_menu=true
GflagsTest --nobig_menu
GflagsTest --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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  windows gflags