Ubuntu下Glog从X86移植到英伟达STM32操作以及glog相关功能修改、避免入坑

文章目录[隐藏]

一、直接将代码从X86Ubuntu拷贝到STM32UBUbuntu下

编译报错如下:

二、glog与gflasgs源码编译安装

1、Glog:https://github.com/google/glog ; Gflags:https://github.com/gflags/gflags直接下载对应的源文件压缩包,并拷贝到使stm32Ubuntu下;

2、分别输入指令: sudo tar -xvf glog/gflags的压缩包进行解压;

3、先对gflags进行源码编译与安装;

输入指令:

> cd gflags

> mkdir build && cd build

> cmake -DGFLAGS_NAMESPACE=google -DCMAKE_CXX_FLAGS=-fPIC -DBUILD_SHARED_LIBS=OFF ..

> make

> sudo make install

4、先对glog进行源码编译与安装;

输入指令:

> cd glog

> mkdir build && cd build

> cmake -DGFLAGS_NAMESPACE=google -DCMAKE_CXX_FLAGS=-fPIC -DBUILD_SHARED_LIBS=OFF ..

> make

> sudo make install

5、如果在编译过程中出现报警warning Manually-specified variables were not used by the project,则需要删除cmake产生的缓存(/usr/local/lib/cmake路径下有对应的glog和gflags文件夹),然后将build文件夹删除后再重新编译;

6、创建测试程序;

新建测试文件夹> mkdir glogtest && cd glogtest

新建测试文件> touch main.cpp

新建CMakeLists.txt > touch CMakeLists.txt

编辑CMakeLists.txt文件如下:

cmake_minimum_required(VERSION 2.8)

project(glogtest)

set(CMAKE_CXX_STANDARD 14)

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake")

find_package(glog REQUIRED)

add_executable(glogtest main.cpp)

target_link_libraries (glogtest  glog)

编辑main.cpp文件如下:

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

int main(int argc, char** argv) {
    google::InitGoogleLogging("glog test main.cpp");//对应生成的INFO文件名
    google::SetLogFilenameExtension("log_");//对应生成的日志文件后缀为log_
    //会输出导致程序结束的信号,和google::InstallFailureWriter(&FatalMessageDump); 配合使用,可以在程序出现严重错误时将详细的错误信息打印出来
    google::InstallFailureSignalHandler(); //注册一下即可。默认是打印到stderr中,可以通过InstallFailureWriter更改输出目标。
    //google::InstallFailureWriter(&FatalMessageDump);//需要自己编写
void FatalMessageDump(const char* data, size_t size)生成崩溃文件函数
    
    google::SetLogDestination(google::INFO, "log/"); // 把日志同时记录文件,最低级别为INFO,此时全部输出到文件夹log下

    // 通过GFLAGS来设置参数,更多选项可以在logging.cc里面查询
    // 日志等级分为INFO, WARNING, ERROR, FATAL,如果是FATAL级别这直接运行报错
    FLAGS_stderrthreshold = google::INFO;    //INFO, WARNING, ERROR都输出,若为google::WARNING,则只输出WARNING, ERROR
    //google::SetStderrLogging(google::GLOG_INFO);
    FLAGS_colorlogtostderr = true;  //log为彩色
    //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

    //基本用法:INFO,WAINING,ERROR
    LOG(INFO) << "Hello GLOG";                // << " cookies";
    LOG(WARNING) << "warning test";    // 会输出一个Warning日志
    LOG(ERROR) << "error test";        // 会输出一个Error日志
    //LOG(FATAL) << "fatal";   // Logging a FATAL message terminates the program (after the message is logged)!
    // 类似assert的功能
    CHECK(access(argv[2], 0) != -1) << "No such file: "<<argv[2];

    //常见用法1:如果满足一定条件,输出错误log,退出程序
    if(1){
        LOG(ERROR) << "No image files for detection";
    }

    //常见用法2:glog提供VLOG宏来提供自定义打印等级的功能.Verbose
    //可以通过命令行"--v=n",来控制VLOG的输出,VLOG(x),x<=n的情况,VLOG会输出,否则不输出.v默认为0,所以默认情况下VLOG(-1),VLOG(0)能够输出.
    //通常把调试的LOG设为1,这样在默认情况下不输出
    VLOG(-1) << "VLOG(-1) message.";
    VLOG(0) << "VLOG(0) message.";
    VLOG(1) << "VLOG(1) message.";
    VLOG(2) << "VLOG(2) message.";
    VLOG(3) << "VLOG(3) message.";

    //常见用法3:
    // 如果工程为Debug模式,下面信息会输出,如果是release模式,下面信息不会输出.
    DLOG(INFO) << "DLOG:Debug Mode Message!";

    //不常见用法4:条件输出
    LOG_IF(INFO, 89 > 4) << "89 > 4";

    //不常见用法5:频率输出,本质上是通过google::COUNTER这个计数机实现的
    LOG(INFO) << "Found " << google::COUNTER <<std::endl;
    for (int i = 0; i < 4; i++)
    {
        LOG_EVERY_N(ERROR, 5) << "每隔5次输出一次 " << i;
        LOG_FIRST_N(ERROR, 2) << "前两次输出 " << i;
        LOG_IF_EVERY_N(WARNING, 1 < 2, 2) << "条件输出+频率" << google::COUNTER;
    }

    google::ShutdownGoogleLogging();  //关闭log服务
    return 0;
}

7、编译运行测试代码

在glogtest文件夹下输入指令>mkdir build && cd build

>cmake ..

>make

编译完成,你将在build文件夹下看到编译处的执行文件glogtest;

输入执行测试程序指令>sudo glogtest

你将看到如下图所示输出:

 

注意输出文件默认存放在/tmp目录下,三个日志级别的.INFO文件以及对应的日志文件;

三、glog功能修改

1、增加文件按天区分

glog文件夹下的utilities.cc中PidHasChanged()函数定义下增加函数如下

static int32 g_main_day = 0;

bool DayHasChanged()

{

    time_t raw_time;

    struct tm* tm_info;



    time(&raw_time);

    tm_info = localtime(&raw_time);



    if (tm_info->tm_mday != g_main_day)

    {

        g_main_day = tm_info->tm_mday;

        return true;

    }



    return false;

}

在logging.cc的LogFileObject::Write函数中将

if (static_cast<int>(file_length_ >> 20) >= MaxLogSize() ||

    PidHasChanged())

改为:

if (static_cast<int>(file_length_ >> 20) >= MaxLogSize() ||

 PidHasChanged() || DayHasChanged()) 

这样就会按照天来输出log了

2、修改输出日志格式

在logging.cc的void LogMessage::Init函数中对应修改

if (FLAGS_log_prefix && (line != kNoLogPrefix)){ stream() << "[" << LogSeverityNames[severity]

                   << ' '

                   << setw(2) << 1+data_->tm_time_.tm_mon

                   << setw(2) << data_->tm_time_.tm_mday

                   << ' '

                   << setw(2) << data_->tm_time_.tm_hour  << ':'

                   << setw(2) << data_->tm_time_.tm_min   << ':'

                   << setw(2) << data_->tm_time_.tm_sec   << "."

                   << setw(6) << data_->usecs_

                   << ' '

                   << setfill(' ') << setw(5)

                   << static_cast<unsigned int>(GetTID()) << setfill('0')

                   << ' ' << data_->basename_ << ':' << data_->line_ << "] ";

如上所示对应日志格式为 :

[LEVEL mmdd hh:mm:ss.uuuuuu threadid file:line] msg

[INFO 1119 16:28:57.912217  7268 main.cc:29] robot start!可根据自身需求更改;

3、所有级别日志只输出到一个文件

修改logging.cc文件下的如下代码

inline LogDestination* LogDestination::log_destination(LogSeverity severity) {

  assert(severity >=0 && severity < NUM_SEVERITIES);

  if (!log_destinations_[severity])

  {

    if (!log_destinations_[GLOG_INFO])

    {

      log_destinations_[GLOG_INFO] = new LogDestination(GLOG_INFO, NULL);

    }

    if(severity != GLOG_INFO)

    {

      log_destinations_[severity] = log_destinations_[GLOG_INFO];

    }

  }

  return log_destinations_[severity];

}



void LogDestination::DeleteLogDestinations() {



  delete log_destinations_[GLOG_INFO];

  log_destinations_[GLOG_INFO] = NULL;

  MutexLock l(&sink_mutex_);

  delete sinks_;

  sinks_ = NULL;

}
  1. 其他功能修改请自行百度;

版权声明:本文为CSDN博主「小菜要扣篮」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u014375643/article/details/121427647

生成海报
点赞 0

小菜要扣篮

我还没有学会写个人说明!

暂无评论

相关推荐

STM32G4之NVIC中断系统

前言 一、NVIC中断机制 stm32G431总共有111个中断源,所以有时难免有两个或者两个以上的中断一起来临,或者正在处理一个中断服务函数时突然又有一个中断来临,以上种种情况微控制器要怎样运行呢&

STM32F2————配置时钟延迟不准的问题

STM32F2配置时钟问题 笔者在本科毕业设计使用STM32F207芯片,但是在配置时钟时出现了问题。 问题 我按照F1写代码的延时函数放在F2竟然不准了 换个办法 使用Systick时钟也是不准,原因是笔者代

[STM32学习]——一文搞懂I2C总线

目录 I2C总线的概念 I2C最重要的功能包括: I2C的物理层 I2C主要特点: I2C的高阻态 I2C物理层总结: I2C的协议层 初始(空闲)状态 开始