怎么在C++二进制文件中注入git信息详解

 更新时间:2021年06月27日 14:17:20   作者:后端技术小屋  
这篇文章主要给大家介绍了关于怎么在C++二进制文件中注入git信息的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

在后端生产环境中,为了方便定位问题,我们需要根据一个binary文件获取其对应的git信息,包括编译出该binary所用的代码分支、commitid、时间戳、commit message等。但是随着代码版本的升级,这些git信息也会随之变化。有没有办法在每次编译binary的时候,将git信息动态注入到其中呢?

答案是有!

创建以下几个文件

创建头文件version.hh,内容如下,其中声明了表示git信息的数据结构

#pragma once

#include <string>

namespace my_app
{
  struct Version
  {
    static const std::string GIT_SHA1;
    static const std::string GIT_BRANCH;
    static const std::string GIT_DATE;
    static const std::string GIT_COMMIT_SUBJECT;
  };
}

创建模板文件,version.cc.in,其中定义了Version中静态变量的值。其中@XX@表示该变量通过cmake注入
#include "version.hh"

#include "version.hh"

using namespace my_app;

const std::string Version::GIT_SHA1 = "@GIT_SHA1@";
const std::string Version::GIT_BRANCH = "@GIT_BRANCH@";
const std::string Version::GIT_DATE = "@GIT_DATE@";
const std::string Version::GIT_COMMIT_SUBJECT = "@GIT_COMMIT_SUBJECT@";

创建main.cc

#include <iostream>
#include "version.hh"

using namespace my_app;

int main() {
    std::cout << "building sha1: " << Version::GIT_SHA1 << std::endl;
    std::cout << "building branch: " << Version::GIT_BRANCH << std::endl;
    std::cout << "building date: " << Version::GIT_DATE << std::endl;
    std::cout << "building commit subject: " << Version::GIT_COMMIT_SUBJECT << std::endl;
    return 0;

创建CMakeLists.txt

cmake_minimum_required(VERSION 3.5)
project (inject_git)
set(GIT_EXECUTABLE /usr/bin/git)

# 执行git rev-parse HEAD, 生成commitid, 将结果保存于变量GIT_SHA1
execute_process(COMMAND
  "${GIT_EXECUTABLE}" rev-parse HEAD
  WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
  OUTPUT_VARIABLE GIT_SHA1
  ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)

# 执行git rev-parse --abbrev-ref HEAD, 生成branch name, 将结果保存于变量GIT_BRANCH
execute_process(COMMAND
  "${GIT_EXECUTABLE}" rev-parse --abbrev-ref HEAD
  WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
  OUTPUT_VARIABLE GIT_BRANCH
  ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)


# 执行git log -1 --format=%ad --date=local, 生成提交日期, 将结果保存于变量GIT_DATE
execute_process(COMMAND
  "${GIT_EXECUTABLE}" log -1 --format=%ad --date=local
  WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
  OUTPUT_VARIABLE GIT_DATE
  ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)

# 执行git log -1 --format=%s, 生成提交日志, 将结果保存于变量GIT_COMMIT_SUBJECT
execute_process(COMMAND
  "${GIT_EXECUTABLE}" log -1 --format=%s
  WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
  OUTPUT_VARIABLE GIT_COMMIT_SUBJECT
  ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)

# 上述变量初始化后,将其注入到模板文件version.cc.in中,生成version.cc
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/version.cc.in" "${CMAKE_CURRENT_BINARY_DIR}/version.cc" @ONLY)

set(SOURCES
    main.cc
	  version.cc
)

# 由version.cc和main.cc生成二进制
add_executable(inject_git ${SOURCES})

二进制文件执行结果如下:

$ ./inject_git                                                                                                                
building sha1: 74b25fc30d18001f72ec0cf0495165441df40a09
building branch: master
building date: Fri May 28 14:49:16 2021
building commit subject: add again

总结

到此这篇关于怎么在C++二进制文件中注入git信息的文章就介绍到这了,更多相关C++二进制注入git信息内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言修炼之路一朝函数思习得 模块思维世间生下篇

    C语言修炼之路一朝函数思习得 模块思维世间生下篇

    函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数
    2022-03-03
  • Qt开发实现跨窗口信号槽通信

    Qt开发实现跨窗口信号槽通信

    这篇文章主要为大家详细介绍了Qt开发实现跨窗口信号槽通信,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • 使用c++实现OpenCV绘制圆端矩形

    使用c++实现OpenCV绘制圆端矩形

    这篇文章主要介绍了使用c++实现OpenCV绘制圆端矩形,其中着重的讲解了OpenCV使用过程中需要注意的一些小细节,避免浪费大家在开发过程中浪费多余的时间
    2021-08-08
  • C语言 超详细介绍与实现线性表中的带头双向循环链表

    C语言 超详细介绍与实现线性表中的带头双向循环链表

    带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而简单
    2022-03-03
  • opencv实现视场转换

    opencv实现视场转换

    这篇文章主要为大家详细介绍了opencv实现视场转换,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • C语言超详细讲解文件的操作

    C语言超详细讲解文件的操作

    C语言文件操作的方法有很多,函数也有很多你知道哪些呢?下面是小编为大家带来的C语言文件操作的方法,欢迎阅读
    2022-04-04
  • C++实现LeetCode(133.克隆无向图)

    C++实现LeetCode(133.克隆无向图)

    这篇文章主要介绍了C++实现LeetCode(133.克隆无向图),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++ Qt开发之PushButton按钮组件的使用详解

    C++ Qt开发之PushButton按钮组件的使用详解

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,本文将重点介绍QPushButton按钮组件的常用方法及灵活运用,感兴趣的小伙伴可以学习一下
    2023-12-12
  • C++中String增删查改模拟实现方法举例

    C++中String增删查改模拟实现方法举例

    这篇文章主要给大家介绍了关于C++中String增删查改模拟实现方法的相关资料,String是C++中的重要类型,程序员在C++面试中经常会遇到关于String的细节问题,甚至要求当场实现这个类,需要的朋友可以参考下
    2023-11-11
  • C++代码和可执行程序在x86和arm上的区别介绍

    C++代码和可执行程序在x86和arm上的区别介绍

    这篇文章主要介绍了C++代码和可执行程序在x86和arm上的区别,X86和ARM是占据CPU市场的两大处理器,各有优劣,本文给大家详细介绍了两者的区别,需要的朋友可以参考下
    2022-07-07

最新评论