Google gflags usage on windows

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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章