Google gflags usage on windows
2016-07-01 14:06
706 查看
gflags 是 google 的开源项目,用来解析程序的命令行输入参数。传统的方法是手工解析argv参数,或者使用getopt函数。两种方法都比较费劲。使用Google gflags可以大大简化命令行参数处理。下面主要记录如何在windows下利用CMake编译gflags,并用CMakeLists来使用gflags,以及基本的使用方法。
使用CMake编译gflags。这里要注意的是,后面我将在glog中使用gflags,需要将gflags在google namespace下编译。所以需要设置环境变量GFLAGS_NAMESPACE为google( -DGFLAGS_NAMESPACE=google )。详情参考stackoverflow。
编译好之后,在build文件夹下有vs工程文件gflags.sln,直接打开生成就行了。build目录就有了lib和include文件夹,里面分别包含了需要的库文件和头文件。
也自己新建VS工程,然后手工指定include目录和lib目录。
还是先贴代码吧。
然后再来说一下怎么使用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。
比如这里定义了一个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,输入时有几种方式:
其中前面两种是令big_menu为true,后面两种令其为false。
同样对于string类型的languages也有几种方式:
为了统一,推荐使用一样的格式, –variable=value for non-boolean flags, and –variable/–novariable for boolean flags。
比如:
GflagsTest -languages=”chinese,french,german” -big_menu=false
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_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/相关文章推荐
- 如何重装TCP/IP协议
- Windows 8 官方高清壁纸欣赏与下载
- 谁是桌面王者?Win PK Linux三大镇山之宝
- 对《大家都在点赞 Windows Terminal,我决定给你泼一盆冷水》一文的商榷
- Windows Clang开发环境备忘
- 从Windows系统下访问Linux分区相关软件
- 对《大家都在点赞 Windows Terminal,我决定给你泼一盆冷水》一文的商榷
- Windows下搭建本地SVN服务器
- 使用Windows原生命令一键清空剪贴板
- windows用windeployqt发布qt quick application程序
- 利用开源软件打造自己的全功能远程工具
- Windows 8虚拟机不能全屏的解决方法
- 虚拟化基础架构Windows 2008篇之1-虚拟化基础服务概述
- 虚拟化基础架构Windows 2008篇之5-安装Windows部署服务
- 虚拟化基础架构Windows 2008篇之7-添加其他操作系统的安装镜像
- 虚拟化基础架构Windows 2008篇之9-配置Windows部署服务
- 虚拟化基础架构Windows 2008篇之12-WSUS工作站端配置
- Visual Studio 2012 示例代码浏览器 - 数以千计的开发示例近在手边,唾手可得