• c++ google glog模块安装和基本使用(ubuntu)环境


    1,如何安装

    1 Git clone https://github.com/google/glog.git

    2 cd glog

    3 ./autogen.sh

    4 ./configure --prefix=path(install)

    5 make

    6 make install

    说一下,下载下来的源码包里带有CMakeList.txt和makefile,所以如果你想把编译的东西隔离出来,并且已经装好了cmake,也可以新建一个build,依次执行:cd build,cmake ..,make,然后就可以在里面看到编译出来用的东西了。

    需要用的东西在哪里?

    1,方法1:

    你的下载目录/glog/.libs/libglog.a

    你的下载目录/src/glog    (下面有一堆h头文件)

    还有一个so文件,不知道是否有用:和.a文件在同一个目录下

    2,方法2

    build/libglog.a

    build/glog/(头文件)

    2,最简单的demo

    //this is main_log.cpp
    
    #include "glog/logging.h"   // glog 头文件
    
    int main(){
        google::InitGoogleLogging("daqing");    //初始化一个log
        FLAGS_logtostderr = 1;  //输出到控制台
    
        LOG(INFO) << "info test";  //输出一个Info日志
        LOG(WARNING) << "warning test";  //输出一个Warning日志
        LOG(ERROR) << "error test";  //输出一个Error日志
        //LOG(FATAL) << "fatal test";  //输出一个Fatal日志,这是最严重的日志并且输出之后会中止程序,暂时注掉
        LOG(INFO)<<"info test lastone";
        google::ShutdownGoogleLogging();    //不用log的时候应该释放掉,不然会内存溢出
    
    }
    //正确的返回结果应该是这样的:
    I0531 09:44:37.912454  5494 main_log.cpp:7] info test
    W0531 09:44:37.912642  5494 main_log.cpp:8] warning test
    E0531 09:44:37.912667  5494 main_log.cpp:9] error test
    I0531 09:44:37.912691  5494 main_log.cpp:11] info test lastone

    如何编译呢?

    3,g++编译

    经过复制粘贴,我的目录结构是这样的:

    ./libglog.a

    ./include/glog/(一堆头文件)

    编译命令:g++ main_log.cpp ./libglog.a -I ./include -std=c++11 -DDEBUG -lpthread -o sample

    一般ubuntu自带g++(或者g++,学名好像叫gun),没有的话apt-get也可以安。

    -lpthread是个啥?

    g++ -l参数就是用来指定程序要链接的库,比如我们自已要用到一个第三方提供的库名字叫libtest.so,那么我们只要把 libtest.so拷贝到/usr/lib里,编译时加上-ltest参数,我们就能用上libtest.so库了,所以-lpthread指向的是一个叫libpthread.so的库文件,并且我和找到了这个库,是这样的/usr/lib/x86_64-linux-gnu/libpthread.so,话说,为啥中间隔了一层啊喂。这个库据说是处理多线程的,大约glog是自己一个线程跑得吧。也挺科学的。

    g++的其他参数:

        .a文件直接在cpp文件后面就可以了,头文件需要用-I(杠i)指明,-std指定c++版本和标准,-o指定输出的文件是sample,实际运行:./sample

    4,cmake编译

    cmake_minimum_required(VERSION 3.5)
    set(CMAKE_CXX_STANDARD 11)
    #规定cmake的最低版本,用以提示用户升级cmake
    project(daqing)
    
    add_executable(daqing main33.cpp )    
    #依据给定的脚本生成一个叫daqing的可执行文件
    find_package(Threads)
    #据说find会在环境的路径中寻找相关的或者依赖的lib,大约是需要在-lpthread之前先定义一个变量或者找一找吧
    include_directories("/home/center/c/include")
    #头文件在哪里呢?
    target_link_libraries(daqing   "/home/center/c/libglog.a" ${CMAKE_THREAD_LIBS_INIT})
    #这句话指定在链接目标文件的时候需要链接的外部库,其效果类似gcc的编译参数“-l”,可以解决外部库的依赖问题,当然了,变量的顺序不能变,不然会造成错误

    5,如何打印日志?

    #include "glog/logging.h"   // glog 头文件
    
    int main(){
    google::InitGoogleLogging("Daqing");    //初始化log的名字为daqing
    google::SetLogDestination(google::GLOG_INFO, "./test_log/");    //设置输出日志的文件夹,文件夹必须已经存在
    google::SetStderrLogging(google::GLOG_WARNING);
    google::SetLogFilenameExtension("log_");
    FLAGS_colorlogtostderr = true;  // Set log color
    FLAGS_logbufsecs = 0;  // Set log output speed(s)
    FLAGS_max_log_size = 1024;  // Set max log file size
    FLAGS_stop_logging_if_full_disk = true;  // If disk is full
    
    LOG(INFO) << "hello i am info!";
    LOG(WARNING) << "hello i am warning test";  //输出一个Warning日志
    LOG(ERROR) << "hello i am error test";  //输出一个Error日志
    google::ShutdownGoogleLogging();
    }

    打印到日志(框加不上,直接复制吧)

    #include "glog/logging.h" // glog 头文件

    int main(int argc,char* argv[]){
    FLAGS_log_dir="/home/center/daqing/glog_project/logs";
    //FLAGS_logtostderr = true; //设置日志消息是否转到标准输出(控制台)
    FLAGS_alsologtostderr = true; //设置日志消息除了日志文件之外是否去标准输出
    //FLAGS_colorlogtostderr = true; //设置记录到标准输出的颜色消息(如果终端支持)
    FLAGS_log_prefix = true; //设置日志前缀是否应该添加到每行输出
    FLAGS_logbufsecs = 1; //设置可以缓冲日志的最大秒数,0指实时输出
    FLAGS_max_log_size = 100; //设置最大日志文件大小(以MB为单位)
    FLAGS_stop_logging_if_full_disk = true; //设置是否在磁盘已满时避免日志记录到磁盘
    google::InitGoogleLogging(argv[0]); //根据程序名称初始化一个日志
    //google::SetLogDestination(google::GLOG_ERROR, "/home/center/daqing/glog_project/logs/error_");
    LOG(INFO) << "info test"; //输出一个Info日志
    LOG(WARNING) << "warning test"; //输出一个Warning日志
    LOG(ERROR) << "error test"; //输出一个Error日志
    //LOG(FATAL) << "fatal test"; //输出一个Fatal日志,这是最严重的日志并且输出之后会中止程序,暂时注掉
    LOG(INFO)<<"info test lastone";
    google::ShutdownGoogleLogging(); //不用log的时候应该释放掉,不然会内存溢出

    }

     

    6,2020.01.03更新

    因为项目需要,最近又重新编译了一下glog,发现竟然跑不起来了!哭,有可能是环境不一样,也有可能是git上的源代码更新了,在此更新一下自己的安装过程,

    缺依赖的提前装一下依赖哦:

    sudo apt-get install autoconf automake libtool 

    git clone https://github.com/google/glog.git
    cd glog
    ##./configure --prefix=path(install)改成了如下的命令
    ./configure CPPFLAGS="-I/usr/local/include" LDFLAGS="-L/usr/local/lib"
    #我估计,大概的意思就是头文件放到了/usr/local/include下,库文件在/usr/local/lib,反正后期g++我正好用,这样的好处是,不用在乱七八糟的安装目录中一通狂找
    make
    sudo make install

    安装完成以后按理说,这个时候复制一下标题2里的demo代码,然后随便找个目录创建main.cpp ,把libglog.a复制到当前文件夹下,执行:

    g++ main.cpp ./libglog.a -I /usr/local/include -L /usr/local/lib -o main.out -lpthread -std=c++11

    就可以了啊,但是,,,想得美,人家给报错了,报错是这样的:

    ./libglog.a(libglog_la-logging.o): In function `__static_initialization_and_destruction_0':
    /home/center/glog/src/logging.cc:112: undefined reference to `google::FlagRegisterer::FlagRegisterer(char const*, char const*, char const*, char const*, void*, void*)'
    /home/center/glog/src/logging.cc:115: undefined reference to `google::FlagRegisterer::FlagRegisterer(char const*, char const*, char const*, char const*, void*, void*)'
    /home/center/glog/src/logging.cc:117: undefined reference to `google::FlagRegisterer::FlagRegisterer(char const*, char const*, char const*, char const*, void*, void*)'
    /home/center/glog/src/logging.cc:119: undefined reference to `google::FlagRegisterer::FlagRegisterer(char const*, char const*, char const*, char const*, void*, void*)'
    /home/center/glog/src/logging.cc:122: undefined reference to `google::FlagRegisterer::FlagRegisterer(char const*, char const*, char const*, char const*, void*, void*)'
    ./libglog.a(libglog_la-logging.o):/home/center/glog/src/logging.cc:133: more undefined references to `google::FlagRegisterer::FlagRegisterer(char const*, char const*, char const*, char const*, void*, void*)' follow
    collect2: error: ld returned 1 exit status

    什么?gflags???黑人问号脸,,,,行吧,我再去编译一下gflags

    git clone https://github.com/gflags/gflags.git
    cd gflags
    mkdir build && cd build
    cmake ..  -DBUILD_SHARED_LIBS=ON -DGFLAGS_NAMESPACE=google -DCMAKE_CXX_FLAGS=-fPIC ..
    make -j4
    sudo make install

    此处参考:感谢原作者

    然后我通过sudo find / -name libgflags.a找到了一个动态库,嘿嘿,我们不如把它,,,拷到main.cpp的目录下,然后,缺啥引啥

    g++ main.cpp ./libglog.a ./libgflags.a -I /usr/local/include -L /usr/local/lib -o main.out -lpthread -std=c++11

    不愧是我,一句都没报错,直接可以运行。。。

    最后说一句,c++关联太多,我也不知道啥是啥了,也不知道为啥不需要gflags的头文件和so库,就记个笔记留着以后找吧:

    glog安装包目录:~/glog -I(-i) /usr/local/include -L /usr/local/lib 动态库:/usr/local/lib/libglog.a

    gflags安装包目录:~/glog/gflags/build -i和-L估计都在里面,另外在-I(-i) /usr/local/include -L /usr/local/lib中貌似也有gflags的库和头,动态库:/usr/lib/x86_64-linux-gnu/libgflags.a

  • 相关阅读:
    RadioButton练习(android)
    关于 RArrayFixFlat 与 RArray 与 CArrayPtrFlat 的测试
    How do I add an attachment to the message
    Grid View
    android 布局文件属性说明(转)
    File 存储(android)
    How to Make an HTTP Connection Using TCP/IP with RSocket
    使用RHTTPTransaction后产生CONE 36 Panic的解决办法
    SharedPreferences 存储(android)
    对话框的练习(android)
  • 原文地址:https://www.cnblogs.com/0-lingdu/p/10954708.html
Copyright © 2020-2023  润新知