这篇文章主要给大家介绍了关于怎么在C++二进制文件中注入git信息的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

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

答案是有!

创建以下几个文件

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

#pragma once#include 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
#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 HEADWORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"OUTPUT_VARIABLE GIT_SHA1ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)# 执行git rev-parse --abbrev-ref HEAD, 生成branch name, 将结果保存于变量GIT_BRANCH
execute_process(COMMAND"${GIT_EXECUTABLE}" rev-parse --abbrev-ref HEADWORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"OUTPUT_VARIABLE GIT_BRANCHERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)# 执行git log -1 --format=%ad --date=local, 生成提交日期, 将结果保存于变量GIT_DATE
execute_process(COMMAND"${GIT_EXECUTABLE}" log -1 --format=%ad --date=localWORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"OUTPUT_VARIABLE GIT_DATEERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)# 执行git log -1 --format=%s, 生成提交日志, 将结果保存于变量GIT_COMMIT_SUBJECT
execute_process(COMMAND"${GIT_EXECUTABLE}" log -1 --format=%sWORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"OUTPUT_VARIABLE GIT_COMMIT_SUBJECTERROR_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(SOURCESmain.ccversion.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信息相关推荐

  1. PHP字符串中的变量解析(+教你如何在PHP字符串中加入变量)

    定义字符串的时候,用单引号或者双引号都是可以的.我个人习惯是用双引号. 在输出字符串的时候,若字符串中含有字符串变量,使用单引号和双引号则是有区别的.如下面程序: 1 2 3 4 5 6 7 8 &l ...

  2. 教你如何在iOS项目中设置各种字体

    原文地址为: 教你如何在iOS项目中设置各种字体 在iOS开发中设置字体的方法有很多种,下面为大家介绍比较常用的三种方法 1.使用系统默认提供的字体 系统默认提供的字体主要是指UIFont中提供的字体 ...

  3. linux7系统怎么启动ftp,教你如何在CentOS7系统中配置ftp服务

    本文教你如何在CentOS7系统中配置ftp服务. 1.下载vsftpd yum install -y vsftpd 2.设置开机自启动 systemctl enable vsftpd.service ...

  4. java filter注入_如何在Java Filter 中注入 Service

    在项目中遇到一个问题,在 Filter中注入 Serivce失败,注入的service始终为null.如下所示: public class WeiXinFilter implementsFilter{ ...

  5. HTML如何设置幻灯片大小和位置,PPT教程:教你如何在PPT母版中统一标题的位置、大小、样式 | 演示说...

    众所周知,一个PPT的详情页中,会有不同的标题,但是如果要统一每一页标题的位置.大小.样式是非常繁琐的事情.那么如何化繁为简,有没有PPT教程通过几个简单的步骤就解决问题呢?当然有,<PPT母版 ...

  6. 如何在Android Studio中查看方法信息?

    本文翻译自:How can I view method information in Android Studio? In Eclipse, when you hover your mouse ove ...

  7. 如何在Django模板中注入全局变量

    我们在做一些网站项目的时候,可能会遇到需要把某个全局变量注入到所有页面的情况,比如我们做一个在线商城,那么可能需要将用户的资料:比如用户的账号.用户的姓名等注入到每个页面里面. 但是如果用常规的方法, ...

  8. 数据库直接存图片mysql_教你如何在MySQL数据库中直接储存图片

    如果你想把二进制的数据,比如说图片文件和HTML文件,直接保存在你的MySQL数据库,那么这篇文章就是为你而写的!我将告诉你怎样通过HTML表单来储存这些文件,怎样访问和使用这些文件. 本文概述: 在 ...

  9. 计算机释放磁盘空间常用方法,教您如何在Win7计算机中释放更多磁盘空间

    计算机本身是一个大型.尽管容量相对较大,但随着时间的流逝,总会有一天磁盘容量不足.我今天想带给您的win7技巧是如何在win7计算机空间中释放更多磁盘! 首先,我们只是在"我的电脑" ...

最新文章

  1. weblogic修改java重启_修改weblogic域的jdk
  2. Spring定时任务注解@Scheduled+@EnableAsync用法详解(简单说明+应用场景+demo源代码+执行过程分析)
  3. python程序写蛇_python蟒蛇绘制程序
  4. vba根据内容调整word表格_给你的word提速
  5. Java高级工程师必看系列,从基础到源码统统帮你搞定
  6. android 拒绝服务漏洞,Android 应用本地拒绝服务漏洞浅析
  7. python字典类型可迭代_核心数据类型--字典
  8. 安装不上vc++环境,导致部分游戏和qq不能用的解决方案
  9. Linux:UDP Socket编程(代码实战)
  10. 预加重/去加重/直流滤波
  11. C语言基础编程题1.0
  12. 构建系统发育树(进化树)的相关知识,以及各种进化树适用的情况。
  13. C语言日常学习中遇到的易错情况(2022.11.14)
  14. 移动端安卓vin码/车架号识别
  15. 2022-2028年中国眼镜制造行业市场竞争策略及未来发展潜力报告
  16. 《全程软件测试》读书心得
  17. 刘鹏计算广告学1:广告的基本知识(一)
  18. ubuntu破解密码方法
  19. 简单认识向上转型和向下转型
  20. Springboot毕设项目医疗云胶片管理系统nem7xjava+VUE+Mybatis+Maven+Mysql+sprnig)

热门文章

  1. 设计模式篇之——策略设计模式
  2. 文档相似度之词条相似度word2vec、及基于词袋模型计算sklearn实现和gensim
  3. selenium之简单使用
  4. 注意 汇编源程序中,数据不能以字母开头,所以要在数据前面加上0
  5. OSPF协议将其管理的网络划分为不同类型的若干区域(Area),其中标准区域特点是(64);存根区域(stub)的特点是(65)。【答案】C B
  6. 2020新款手机,吃鸡贼爽!包邮送一个!
  7. 基于OpenCV的网络实时视频流传输
  8. scala基本语言结构以及函数算子(持续更新......)
  9. web自适应尺寸方法
  10. 【ZZ】浅谈大型web系统架构 | 菜鸟教程