gflags是一个c++开发的, google维护的argparse库, 在python中同类替代品为absl, 由于我们写c++程序的时候, 大部分都是二进制可执行程序, 通过gflags可以统一的管理命令行参数
安装
我的开发环境是centos7, 已经安装了开发套件, 并且安装了cmake3以上版本
git clone https://github.com/gflags/gflags.git
cd gflgas
cmake .
make
然后会编译出两个静态库文件
-rw-rw-r--. 1 admin admin 253796 Mar 30 22:01 libgflags.a
-rw-rw-r--. 1 admin admin 253742 Mar 30 22:01 libgflags_nothreads.a
其中带nothreads是单线程版本, 即threading library not found
的版本, 这个我们不太需要
依赖
由于个人在管理c++项目的时候喜欢使用cmake构建, 而且我一般喜欢按照如下的目录结构来构造项目
├── CMakeLists.txt
├── main.cpp
├── thirdparty
│ ├── folly
│ │ ├── include
│ │ └── lib
│ ├── srpc
│ │ ├── include
│ │ └── lib
│ └── workflow
│ ├── include
│ └── lib
└── utils
├── CMakeLists.txt
├── logger.cc
└── logger.h
由于gflags我们已经编译好静态库了, 所以在cmake中只需要include 头文件 + 链接时指定 .a即可
在CMakeLists.txt中加入一下代码
include_directories("thirdparty/gflags/include")
target_link_libraries(${BIN_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/gflags/lib/libgflags.a)
#注意target_link_libraries必须为绝对路径
使用
DEFINE有三个宏,其意义分别为:flag的名称,flag的默认值,help字符串。如何查看help信息呢,在执行可执行文件时加上–help选项即可,但是如果要显示help信息,代码里需要调用接口gflags::ParseCommandLineFlags(&argc, &argv, true)才行。
- DEFINE_bool: 布尔类型
- DEFINE_int32: 32-bit 整型
- DEFINE_int64: 64-bit 整型
- DEFINE_uint64: 无符号 64-bit 整型
- DEFINE_double: double
- DEFINE_string: C++ string
对于DEFINE过的flag我们可以像使用普通变量那样读写它,只需加一个“FLAGS_”前缀即可,如下:
if (FLAGS_is_handsome)
FLAGS_is_handsome = false;
std::cout << FLAGS_hobby << std::endl;
那么如何在其他文件中使用flags变量呢? 只需要declare一下就可以
在其他文件中使用flag
形如上述例子,我们在一个源文件中使用flag方式是先“DEFINE_”然后“FLAGS_”使用即可,但如果想在其他文件访问这个flag呢?举个例子,我们上述flag定义在hello.cpp,而我们要在bye.cpp中使用它,那么我们只需在bye.cpp中做如下声明:
#类似于extern
DECLARE_bool(is_handsome);
DECLARE_string(hobby);
#include <gflags/gflags.h> // 头文件必须得加啊啊啊啊啊
DEFINE_bool(is_handsome, true, "Is the author a handsome guy");
DEFINE_string(hobby, "eat, drink, sleep",
"comma-separated list of hobby to offer in the 'hobby' menu");
int main(int argc, char* argv[]) {
gflags::ParseCommandLineFlags(&argc, &argv, true);
}