简介
在Linux下我们常用gcc –version命令,find –help命令,可是这些命令是怎么实现的呢?
本文以实例的形式说明gflags是如何实现上述命令的。
引用http://www.yeolar.com/note/2014/12/14/gflags/的一段话。
GFlags是Google开源的一个命令行flag(区别于参数)库。和 getopt() 之类的库不同,flag的定义可以散布在各个源码中,而不用放在一起。一个源码文件可以定义一些它自己的flag,链接了该文件的应用都能使用这些flag。这样就能非常方便地复用代码。如果不同的文件定义了相同的flag,链接时会报错。
GFlags是一个C++库,同时也有一个Python移植,使用完全相同的接口。
使用
1.安装gflags
从gitHub上https://github.com/gflags/gflags下载gflags源码,编译成lib文件。
2.加入lib文件和库目录
3.例子
#include <gflags\gflags.h>
#include<iostream>
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");
DEFINE_string(backend, "lmdb",
"The backend {leveldb, lmdb} containing the images");
void doSth(){
}
int main(int argc,char** argv){
gflags::SetUsageMessage("Compute the mean_image of a set of images given by"
" a leveldb/lmdb\n"
"Usage:\n"
" compute_image_mean [FLAGS] INPUT_DB [OUTPUT_FILE]\n");
std::cout << FLAGS_languages << std::endl;
// Google flags.
int* pargc= &argc;
char*** pargv=&argv;
::gflags::ParseCommandLineFlags(pargc, pargv, true);//true表示不保留定义的flags
gflags::ShowUsageWithFlagsRestrict(argv[0], " this is gflags useage test");
if (FLAGS_languages.find("finnish") != std::string::npos)
doSth();
return 0;
}
运行结果如下:
4.案例2—一处定义多处访问
由于flag支持的类型有:
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
我可以用它在不同文件中作共享变量,用来传值,作用相当于extern。
文件Healer.h
#include<gflags\gflags.h>
DEFINE_bool(test, true, "This text should be stripped out");
文件main.cpp
#include"Header.h"
#include <gflags/gflags_declare.h>
#include <iostream>
DECLARE_bool(test); // in head.h
int main(int argc, char** argv) {
std::cout << FLAGS_test << std::endl;
system("pause");
return 0;
}