1. gflags
1.1 简要介绍
gflags
是google
开源的一套命令行参数解析工具,使用C++开发,具备Python
接口,可以替代getopt
,gflags
使用起来比getopt
方便,但是不支持参数的简写(例如getopt
支持–list
缩写成-l
,gflags
不支持)。
1.2 依赖库
gflags
不需要再配置其他库。
1.3 源码包下载
gflags
源码地址:
github
:https://github.com/gflags/gflags.git
2. Cmake构建项目
2.1 路径
源代码路径:D:/ThirdParty/gflags/gflags_3.3.8
构建项目路径:D:/ThirdParty/gflags/gflags_3.3.8_build
2.2 构建选项
名称 |
值 |
备注 |
BUILD_TESTING |
false |
减少编译时间 |
CMAKE_INSTALL_PREFIX |
path |
编译时生成的安装文件路径 |
BUILD_SHARED_LIBS |
true |
生成dll 动态库 |
2.3 构建项目
步骤如下:
- 指定源码路径;
- 指定构建项目路径;
- 点击
Configure
;
- 按照2.2节表中的值进行设置;
- 再次点击
Configure
;
- 点击
Generate
,构建项目路径中将生解决方案文件gflags.sln
。
点击Configure
或Generate
后,如果顺利,会出现Configuring done
或Generating done
。
3. 打开解决方案并编译
3.1 编译解决方案
点击Open Project
(或者在2.3节步骤2中指定的构建项目路径中,找到生成的解决方案文件gflags.sln
,通过Visual Studio
打开),打开通过Cmake
构建的项目;
选中ALL_BUILD
项目,分别在Debug
和Release
模式下,重新生成解决方案。
3.2 安装gflags
选中INSTALL
项目,右击,重新生成,此时,将会在指定路径下(2.2节表中CMAKE_INSTALL_PREFIX
选项的值)生成3个文件夹include
,lib
和bin
。
4. 实际项目环境配置
注:以下通过属性表的方式进行环境配置。
4.1 附加包含目录
$(gflags)\include
$(gflags)
(在系统环境变量中添加并设置)就是2.2节表中CMAKE_INSTALL_PREFIX
选项的值。
4.2 附加库目录
-
$(gflags)\lib
4.3 附加依赖项
-
gflags_debug.lib
或gflags.lib
-
gflags_nothreads_debug.lib
或gflags_nothreads.lib
将库目录$(gflags)\lib
中文件后缀名为.lib
的文件依次添加至附加依赖项中,并依次配置debug版本(有_debug
后缀)和release版本。
注意,添加附加依赖项时,不要漏掉文件后缀名.lib
!
4.4 动态库
将动态库目录添加至系统环境变量Path
,步骤如下:
- 计算机右击,点击“属性”;
- 点击“高级系统设置”;
- 点击“环境变量”;
- 双击
Path
;
- 添加
%fglags%\bin
,该目录下是包含了动态库文件。
本文使用的都是相对路径,因此需事先设置好环境变量gflags
,值为CMAKE_INSTALL_PREFIX
对应的目录,也可以使用绝对路径。
4.2 测试代码
#include <iostream>
#include <gflags/gflags.h>
DEFINE_int32(port, 111, "Host name");
//检查函数,检查函数是否符合要求
static bool ValidatePort(const char* name, int32_t val)
{
if (val > 0 && val < 2000)
return true;
std::cout << "Invalid value for --" << name << ": " << val << std::endl;
return false;
}
// 使用全局 static 变量来注册函数,static 变量会在 main 函数开始时就调用
//必须在main开始时进行注册,否则无法监测命令行参数
static const bool port_dummy = gflags::RegisterFlagValidator(&FLAGS_port, &ValidatePort);
int main(int argc, char** argv)
{
//初始化参数
gflags::ParseCommandLineFlags(&argc, &argv, true);
std::cout << "the server port is: " << FLAGS_port << std::endl;
// 使用 SetCommandLineOption 函数对参数进行设置才会调用检查函数
gflags::SetCommandLineOption("port", "-3");
std::cout << "the server port is: " << FLAGS_port << std::endl;
//std::system("pause");
return 0;
}