c++开发必备库-gflags安装与使用(cmake环境下)

admin 2021-03-30 PM 79℃ 0条

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);
}
标签: cmake, c++, gflags

非特殊说明,本博所有文章均为博主原创。

评论啦~