用Blade构建glog和gflags小项目

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/okiwilldoit/article/details/82113127

一.Blade介绍

在软件项目开发过程中,make 工具通常被用来建造程序。make 工具通过一个被称为 Makefile 的配置文件可以自动的检测文件之间的依赖关系,这对于建造复杂的项目非常有帮助,然而,编写 Makefile 本身却不是一件容易的事情。SCons 是一个用 Python 语言编写的类似于 make 工具的程序。

与 make 工具相比较,SCons 的配置文件更加简单清晰明了,除此之外,它还有许多的优点。

Blade 是一个现代构建系统,期望的目标是强大而好用,把程序猿从构建的繁琐中解放出来,它是基于scons的。

Blade主要定位于linux下的大型C++项目,密切配合研发流程。比方单元測试。持续集成,覆盖率统计等。但像unix下的文本过滤程序一样,保持相对的独立性,能够单独执行。眼下重点支持i386/x86_64 Linux,未来能够考虑支持其他的类unix系统。

在腾讯公司“台风”云计算平台开发过程中。为了解决 GNU Make,Autotools 的难用和繁琐的问题,我们开发了这个全新的构建系统。整个系统基于多个声明式的构建脚本,在构建脚本里,仅仅须要声明要构建什么目标,目标的源码,以及其直接依赖的其他目标。不须要说明怎样构建。大大降低了使用难度。提高了开发效率。

源代码及文档如下:
https://github.com/chen3feng/typhoon-blade

二. gflag

google开源的gflags是一套命令行参数解析工具,比getopt功能更强大,使用起来更加方便,gflags还支持从环境变量、配置文件读取参数(可用gflags代替配置文件)。

gflags主要支持的参数类型包括bool,int32, int64, uint64, double, string等,定义参数通过DEFINE_type宏实现,如下所示,分别定义了一个bool和一个string类型的参数,该宏的三个参数含义分别为命令行参数名,参数默认值,以及参数的帮助信息。

DEFINE_bool(big_menu, true, “Include ‘advanced’ options in the menu listing”);
DEFINE_string(languages, “english,french,german”,
“comma-separated list of languages to offer in the ‘lang’ menu”);
gflag不支持列表,用户通过灵活借助string参数实现,比如上述的languages参数,可以类型为string,但可看作是以逗号分割的参数列表。

访问参数
当参数被定义后,通过FLAGS_name就可访问到对应的参数,比如上述定义的big_menu、languages两个参数就可通过FLAGS_big_menu、FLAGS_languages访问。

  • 如果是命令行读取参数:
#include <gflags/gflags.h>
...
int main(int argc, char* argv[]) {
    google::ParseCommandLineFlags(&argc, &argv, true/*表示把识别的参数从argc/argv中删除*/);
    ...
}
  • 如果是从配置文件中读取:
    如果要从conf/gflags.conf中加载gflags,则可以加上参数-flagfile=conf/gflags.conf。如果希望默认(什么参数都不加)就从文件中读取,则可以在程序中直接给flagfile赋值,一般这么写:
google::SetCommandLineOption("flagfile", "conf/gflags.conf");

程序启动时会检查conf/gflags.conf是否存在,如果不存在则会报错:
conf/gflags.conf: No such file or directory

在命令行中参数和值之间可不加等号,而在flagfile中一定要加。比如./myapp -param 7是ok的,但在./myapp -flagfile=./gflags.conf对应的gflags.conf中一定要写成-param=7–param=7,否则就不正确且不会报错。

三.glog

glog 是google的开源日志系统,相比较log4系列的日志系统,它更加轻巧灵活,而且功能也比较完善。
glog 默认对log分为4级: INFO, WARNING, ERROR, FATAL.
打印log语句类似于C++中的stream,实际上LOG(INFO) 宏返回的是一个继承自std::ostrstream类的对象。

参考文档:
https://blog.csdn.net/sinat_25929227/article/details/73832280
http://blog.51cto.com/mengjh/546766

四.代码示例

1.目录结构:
这里写图片描述
2.common下目录结构
这里写图片描述
hello.h

#ifndef  HELLO_H
#define  HELLO_H

class Hello {
public:
    void print();
};
#endif

hello.cpp

#include <iostream>
#include "hello.h"

using namespace std;

void Hello::print() {
    cout << "hello,world" << endl;
}

BUILD文件:

cc_library(
    name = 'hello',
    srcs = [ 'hello.cpp' ],
    deps = [
])

这里面构建的是静态库文件,所以target是cc_library
3. main函数

#include <iostream>
#include <glog/logging.h>
#include <gflags/gflags.h>

#include "common/hello.h"

using namespace std;

DEFINE_string(ip, "192.168.144.111", "program listen ip");
DEFINE_int32(port, 1111, "program listen port");
DEFINE_bool(debug, true, "run debug mode");

int main(int argc, char** argv) {
    google::ParseCommandLineFlags(&argc, &argv, true);//初始化参数

    cout << "ip = " << FLAGS_ip << endl;
    cout << "port = " << FLAGS_port << endl;

    if (FLAGS_debug) {
        cout << "this is a debug mode..." << endl;
    }
    else {
        cout << "this is a nodebug mode...." << endl;
    }

    // 初始化日志
    google::InitGoogleLogging(argv[0]);

    //FLAGS_log_dir = ".";   //设置log目录
    google::SetLogDestination(google::GLOG_INFO, "./log_"); //设置log文件名称

    LOG(INFO) << "==============hello world=============";

    Hello he;
    he.print();
    return 0;
}

BUILD文件:

cc_binary(
    name = 'main',
    srcs = [ 'main.cpp' ],
    deps = [
        '//common:hello',
        '#glog',
        '#gflags',
    ]
)

这里编译成可执行文件,所以target是cc_binary

必须要有BLADE_ROOT文件,来表示编译根目录,文件填空即可,但必须要有这个文件。

4.编译
进入BLADE_ROOT所在的根目录,执行:

blade build

即可编译成功。可执行文件在build64_release文件夹下。
运行结果(注意命令行参数格式):
这里写图片描述

猜你喜欢

转载自blog.csdn.net/okiwilldoit/article/details/82113127