gflag以及glog安装

Gflags安装与使用

如何安装

gflags 是一个 C++ 库,用于解析命令行参数。下面是安装步骤:

1
2
3
4
5
6
7
git clone https://github.com/gflags/gflags.git
cd gflags
mkdir build-dir
cd build-dir
cmake ..
make
sudo make install

NOTICE:如果是为了装后面的glog

遇到libgflags.a(gflags.cc.o): relocation R_X86_64_32 against `.rodata.str1.1' ca时

1
2
3
4
5
6
7
8
glfag编译成动态库gflags 正确的安装方法是这样的: 
Need cmake >2.8.4 (current is 2.8.3)
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr/local -DBUILD_SHARED_LIBS=ON -DGFLAGS_NAMESPACE=google -G "Unix Makefiles" ../
make
sudo make install
sudo ldconfig

CMakeListsx.txt 配置:

1
2
3
4
find_package (gflags REQUIRED)
include_directories (${gflags_INCLUDE_DIR})
add_executable (main main.cpp)
target_link_libraries (main gflags)

使用介绍

定义命令行 flag:

1
2
3
#include <iostream>
#include <gflags/gflags.h>
DEFINE_int32(port, 8080, "What port to listen on");

这行代码定义了一个命令行 flag,名字是 port,它的类型是gflags::int32,默认值是8080。除了int32之外,gflags 还支持bool、int64、uint64、double和string类型。 定义好一个 flag 之后,还可以给它加上一个校验函数,验证 flag 的取值是否合法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <gflags/gflags.h>
static bool ValidatePort(const char* flagname, gflags::int32 value)
{
if (value > 0 && value < 32768)
{
return true;
}
return false;
}
DEFINE_int32(port, 8080, "What port to listen on");
DEFINE_validator(port, &ValidatePort);
DEFINE_bool(debug, false, "Turn on the debug mode");
int main(int argc, char *argv[])
{
gflags::ParseCommandLineFlags(&argc, &argv, true);
std::cout << "port = " << FLAGS_port << std::endl;
std::cout << "debug = " << std::boolalpha << FLAGS_debug << std::endl;
return 0;
}

上面的代码会验证port的取值范围,如果取值不合法,则会报错:

1
2
3
4
5
6
7
8
$ ./main --port=5800 --debug
port = 5800
debug = true
$ ./main --port=5800 --nodebug
port = 5800
debug = false
$ ./main --port=100000 --debug
ERROR: failed validation of new value '100000' for flag 'port'

参考资料

https://gflags.github.io/gflags/

Glog安装与使用

如何安装

glog 是一个 C++ 日志库,它提供 C++ 流式风格的 API。在安装 glog 之前需要先安装 gflags,这样 glog 就可以使用 gflags 去解析命令行参数。下面是 glog 的安装步骤:

1
2
3
4
5
6
git clone https://github.com/google/glog.git
cd glog
mkdir build
cmake ..
make
sudo make install

CMakeLists.txt 配置:

1
2
3
find_package (glog 0.3.5 REQUIRED)
add_executable (main main.cpp)
target_link_libraries (main glog::glog)

日志级别

glog 支持四种日志级别,INFO、WARNING、ERROR和FATAL。默认情况下,在打印完FATAL日志之后,程序将会终止。ERROR和FATAL的日志除了会写到日志中,还会输出到 stderr。

1
2
3
4
5
6
7
8
9
10
#include <gflags/gflags.h>
#include <glog/logging.h>
int main(int argc, char* argv[])
{
// 解析命令行参数
gflags::ParseCommandLineFlags(&argc, &argv, true);
// 初始化日志库
google::InitGoogleLogging(argv[0]);
LOG(ERROR) << "Hello, World!";
}

日志输出配置

默认情况下,glog 会将日志输出到 /tmp 目录下,日志文件命名格式为:

1
<program name>.<hostname>.<user name>.log.<severity level>.<date>.<time>.<pid>

通过命令行 flag log_dir指定日志目录:

1
./main --log_dir=.    # 将日志输出到当前目录

glog 还支持其它的命令行 flag:

  • logtostderr将日志输出到 stderr,不输出到日志文件,默认值是 false。
  • minloglevel如果程序输出的日志的级别大于或等于这个值,那么日志就会被记录下来,它的默认值是 0,代表INFO (1 代表WARNING,2 代表ERROR,而 3 代表FATAL)。

调试模式

一种常见的调试手段就是使用 debug 日志,在调试模式下 (也即没有开启NDEBUG),可以使用DLOG()来输出 debug 日志,例如:

1
DLOG(INFO) << "Hello, World!";

检查程序错误

glog 提供了CHECK()宏帮助我们检查程序的错误,当CHECK()的条件不满足时,它会记录FATAL日志并终止程序:

1
CHECK(fun() == 0) << "Call fun() failed!";

与assert()不同的是,无论程序是否开启NODEBUG,CHECK()都会执行。除了CHECK(),glog 还提供其它的宏,包括CHECK_EQ()、CHECK_NE()、CHECK_LE()、CHECK_LT()、CHECK_GE()和CHECK_GT()。 在判断指针是否为NULL时,需要注意先将NULL转换成为相应的类型,然后再进行比较:

1
CHECK_EQ(some_ptr, static_cast<SomeType*>(NULL)) << "some_ptr is a null pointer";

glog 还提供了其它宏用来检查char *类型的字符串,包括CHECK_STREQ()、CHECK_STRNE()、CHECK_STRCASEEQ()和CHECK_STRCASENE(),带有 CASE 的版本表示大小写不敏感的。传递NULL值给这些宏是安全的。 另外,可以使用CHECK_DOUBLE_EQ()检查两个浮点数是否相等,允许出现比较小的误差。如果需要自己提供可以接受的误差范围,可以使用CHECK_NEAR(),它的第三个参数为用户指定的误差范围。

参考资料

http://rpg.ifi.uzh.ch/docs/glog.html