本文主要介绍C命令行解析包gflags的使用教程。通过示例代码非常详细的介绍,对大家的学习或者工作都有一定的参考价值。有需要的朋友就跟着下面的边肖学习吧。
目录
安装介绍
例子
使用精化来定义参数
参数分析
用于参数验证的参数
检查参数是否已设置。
文件介绍
引入环境变量
在程序中指定
完整示例
其他通用参数
自定义版本和帮助信息
CMake使用
整数选择
其他的
涉及
前言
Gflags是Google提供的命令行参数处理开源库,现在已经独立开源。它比传统的getopt()更强大,可以将不同的参数定义分发给各种源文件,无需集中管理。
有C和Python两个版本。这里只详细介绍C版本的使用。
简介
配置参数是分开管理还是集中管理,没有严格的约束,关键看项目中的统一规范。但是,gflags可以支持这两种方式,允许用户更灵活地使用它们。
当参数分布到各个源文件时,如果定义了相同的参数,编译时会直接报错。
固定
许多发行版都有自己的开发库。下面简单介绍一下使用CMake从源代码编译。源代码可以从GitHub gflags版本中选择。
以下命令以最新版本2.2.2为例。
$ tar xzf gflags-2.2.2.tar.gz
$ cd gflags-2.2.2
$ mkdir构建cd构建
$ cmake-DC make _ INSTALL _ PREFIX=/usr.
$ make
$ make test #单元测试,执行cmake时需要添加-DBUILD_TESTING=true参数。
# make install #安装,一般需要root用户来执行。
默认情况下,它将安装在/usr/local目录中。您需要配置动态库、头文件路径等。通过上面提到的-DCMAKE_INSTALL_PREFIX=/usr参数修改这个路径,使用系统默认路径。此时,将安装以下文件。
/usr/lib/libgflags.a
/usr/lib/libgflags_nothreads.a
/usr/include/gflags/gflags.h
/usr/include/gflags/gflags _ declare . h
/usr/include/g flags/g flags _ completions . h
/usr/include/gflags/gflags _ gflags . h
/usr/lib/cmake/gflags/gflags-config . cmake
/usr/lib/cmake/gflags/gflags-config-version . cmake
/usr/lib/cmake/gflags/gflags-targets . cmake
/usr/lib/cmake/gflags/gflags-targets-release . cmake
/usr/lib/cmake/gflags/gflags-nonamespace-targets . cmake
/usr/lib/cmake/gflags/gflags-nonamespace-targets-release . cmake
/usr/bin/gflags_completions.sh
/usr/lib/pkgconfig/gflags.pc
详细安装请参考gflags install.md中的介绍可以使用ccmake选择配置项,也可以使用上述cmake参数进行配置。
例子
假设有一个网络客户端代码,需要指定服务器的地址和端口,希望有默认的参数,同时允许用户通过命令行指定不同的值。
#包括iostream
#包含gflags/gflags.h
DEFINE_string(主机,' localhost ','服务器主机地址');
DEFINE_int32(端口,8080,'服务器端口');
int main(int argc,char **argv)
{
gflags:ParseCommandLineFlags(argc,argv,true);
' std:cout '获取了' ' FLAGS_host ':' FLAGS_port ' '。'STD:endl;
返回0;
}
代码开头通过DEFINE_XXX定义参数,包括变量名、默认值、参数引入等。在主程序中,使用gflags:ParseCommandLineFlags()函数解析参数;使用时,只需在变量名前添加FLAGS_ header即可。
通过下面的命令行编译。
g main . cc-STD=c 11-o g flags-LG flags-LP thread
默认情况下,pthread线程库是必需的。不使用多线程时,不确定如何关闭该参数。
然后,您可以按如下方式指定参数。
-不指定参数,使用默认值。
$ ./gflags
得到“本地主机:8080”。
-您可以选择指定一个或多个参数。
$ ./gflags-宿主www.foobar.com
得到了‘www . foobar . com:8080’。
$ ./gflags-端口80
获得“本地主机:80”。
$ ./gflags-主机www.foobar.com-端口80
得到了‘www . foobar . com:80’。
-同时支持不同的参数指定方法。
$ ./gflags -主机www.foobar.com-端口80
得到了‘www . foobar . com:80’。
$ ./gflags - host=www.foobar.com=-端口80
得到了‘www . foobar . com:80’。
同时,还可以使用- help参数查看帮助信息,包括gflags库提供的参数和用户提供的参数。以下是输出用户参数信息。
main.cc中的标志:
-host(服务器主机地址)类型:字符串默认值:“localhost”
-port(服务器端口)类型:int32默认值:8080
然后看详细用法。
使用的详细说明
包含如何定义、解析等使用场景。
定义参数
上例定义了两类参数,string string和integer int32,包括变量名、默认值和参数引入。这三个参数都是必需的。
Gflags总共提供了六个定义(或类型)。
DEFINE_bool布尔值
DEFINE_int32 32位整数
DEFINE_int64 64位整数
DEFINE_uint64无符号64位整数
定义_double double
定义字符串C字符串
它可以在某个名称空间下定义,因此必须与名称空间前缀一起使用。如果在不同的文件中定义,可以在某个集合的头文件中用DECLARE_XXX(VAR)声明。
注意,不要用相同的名称定义参数,即使在不同的名称空间中;有几个保留参数,包括env的标志文件tryfromenv等等。
参数分析
在上面的例子中,参数是由ParseCommandLineFlags()函数解析的,也有一种不需要帮助文档的解析方法。这两个函数的声明如下。
uint 32 ParseCommandLineFlags(int * argc,char*** argv,bool remove _ flags);
uint 32 ParseCommandLineNonHelpFlags(int * argc,char*** argv,bool remove _ flags);
其中remove_flags标识指定参数的处理方法。如果为真,解析时会从argv中删除flag及其对应的值,并修改argc,即存储最后一个不包含flag的参数;如果为false,则只重新排列参数,并将标志参数放在第一位。
参数校验
要检查参数的值是否合法,可以为某个参数注册一个验证函数。当参数被解析或修改时(调用SetCommandLineOption()时),将调用验证函数。如果返回true,验证将成功,否则将失败。
下面是端口参数的验证。
#包括iostream
#包含gflags/gflags.h
DEFINE_string(主机,'本地主机','服务器主机地址。');
DEFINE_int32(端口,8080,'服务器端口。');
静态bool validate port(const char * flag,gflags:int32 value)
{
if(值0值32768)
返回true
“std:cerr”的值对“flag”:“value STD:endl”无效;
返回false
}
static const bool port _ dummy=gflags:RegisterFlagValidator(FLAGS _ port,ValidatePort);
int main(int argc,char **argv)
{
gflags:ParseCommandLineFlags(argc,argv,true);
STD:cout ' get ' ' FLAGS _ host ':' FLAGS _ port ' ' ' STD:endl;
返回0;
}
如果超出指定范围,将会报告错误。
使用参数
默认帮助用于查看帮助信息。指定的参数可以使用-或-符号,参数和值的划分可以使用``或=,如上例所示。
对于布尔类型,也可以使用-foobar-no foobar-foobar=true-foobar false来指定它们。
检查参数是否已设置。
参数被ParseCommandLineFlags()函数解析后,可以通过以下方法检查对应的变量是否被设置。
gflags:CommandLineFlagInfo信息;
if(g flags:GetCommandLineFlagInfo(' port ',info) info.is_default) {
未设置std:cout端口。STD:endl;
}否则{
std:cout '端口已设置。STD:endl;
}
这里,不直接比较的设置值与默认值相同。即使指定了与默认值相同的值,也将认为该参数已被修改。
文件介绍
您可以通过- flagfile=FileName指定参数文件名,也可以使用通配符*和?在文件中每行标识一个参数,例如:
$ cat flags.txt
#这是测试服务器。
- host=www.foobar.com
-端口=80
$ ./gflags - flagfile flags.txt
得到了‘www . foobar . com:80’。
以#开头的注释也可以再次使用- flagfile=FileName包含一个参数配置文件。
引入环境变量
可以使用-fromenv或- tryfromenv从环境变量中引入参数,也可以指定由-fromenv=foo,bar读取的参数。当然,您需要首先设置环境变量。
export FLAGS _ foo=xxxexport FLAGS_bar=yyy # sh
setenv FLAGS _ foo xxxsetenv FLAGS_bar yyy # tcsh
这相当于在命令行上指定-foo=XXX-bar=yyy参数。
其中,如果环境变量不存在,则- fromenv将报告错误,如果环境变量不存在,则- tryfromenv将使用默认值。
在程序中指定
最常见的是允许用户动态配置,也就是动态加载,可以通过调用SetCommandLineOption()函数来实现,其声明如下。
STD:string setcommandline option(const char * name,const char * value);
比如说。
gflags:SetCommandLineOption(' port ',' 9999 ');
将成功返回端口设置为9999的字符串,否则将返回空字符串。
另外,还可以通过bool getcommandline option(const char * name,std: string * OUTPUT)函数获取flag的接口。如果未指定,将通过输出返回默认值,只有在指定了未定义的标志名时,才会返回false。
可以使用if (FLAGS_foo)进行正常读写;FLAGS_Foo=bar,但是如果需要线程安全调用,建议使用这两个函数。
完整示例
上述设置的完整示例如下。
#包括iostream
#包含gflags/gflags.h
DEFINE_string(主机,'本地主机','服务器主机地址。');
DEFINE_int32(端口,8080,'服务器端口。');
静态bool validate port(const char * flag,gflags:int32 value)
{
if(值0值32768)
返回true
“std:cerr”的值对“flag”:“value STD:endl”无效;
返回false
}
static const bool port _ dummy=gflags:RegisterFlagValidator(FLAGS _ port,ValidatePort);
int main(int argc,char **argv)
{
gflags:SetVersionString(' 1 . 1 . 0 ');
gflags:SetUsageMessage('。/gflags ');
gflags:ParseCommandLineFlags(argc,argv,true);
STD:cout g flags:setcommandline option(' port ',' 999 ')STD:endl;
STD:cout ' get ' ' FLAGS _ host ':' FLAGS _ port ' ' ' STD:endl;
返回0;
}
可以用命令gmain . cc-STD=c11-o g flags-LG flags-LP thread编译。
其他的
常用参数
GFS中有几个默认参数。
- help显示所有文件的所有标志,按文件和名称排序,并显示标志名称、默认值和帮助。
- helpfull与- help相同,显示所有标志。
- helpshort只显示执行文件中包含的标志,通常是main()所在的文件。
- helpxml类似于-help,但输出是xml。
- helpon=FILE仅显示文件中定义的标志。*
-helpmatch=s仅显示在*S*中定义的标志。*
- helppackage在与main()相同的目录中显示文件中的标志
- version打印执行文件的版本信息。
-undef ok=flagname,flagname,后面列出的标志名可以被忽略,没有任何定义,也不会报告错误。
- fromenv - tryfromenv从环境变量引入。
-从文件中引入flagfile。
自定义版本和帮助信息
通过- version和- help,默认会输出相应的版本和帮助信息。也可以通过SetVersionString()设置版本信息,通过SetUsageMessage()设置帮助的启动软件信息(帮助信息不能被覆盖)。
gflags:SetVersionString(' 1 . 1 . 0 ');
gflags:SetUsageMessage('。/gflags ');
注意,参数的设置需要在调用ParseCommandLineFlags()之前完成。
CMake使用
最新版本的gflags已经可以支持CMake了。如上图安装所示,安装时相关文件会安装在/usr/lib/cmake/gflags/目录下,所以可以在项目中使用如下。
FIND_PACKAGE(需要gflags)
包含目录(${gflags_INCLUDE_DIR})
添加可执行文件(foo main.cc)
目标_链接_库(foo gflags)
如果CMake安装在另一个路径中,可以将上述文件复制到CMake的模块路径中重复使用。
整数选择
在gflags/gflags_declare.h中定义了int32 int64等类型,可以直接使用,但编译时需要添加-std=c 11参数,否则使用cstdint头文件时会报错。
其他的
可以通过void getall flags(STD:vectorcommandlineflaginfo * output)接口遍历所有参数。更多接口,可以查看gflags/gflags.h头文件。
涉及
可以详细查看官方文档中关于如何使用gflags的介绍。
就是这样。本文介绍了使用C命令行解析包gflags的教程。有关使用C命令行解析包gflags的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。