教你如何在C++二进制文件中注入git信息
这篇文章主要给大家介绍了关于怎么在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信息相关推荐
- PHP字符串中的变量解析(+教你如何在PHP字符串中加入变量)
定义字符串的时候,用单引号或者双引号都是可以的.我个人习惯是用双引号. 在输出字符串的时候,若字符串中含有字符串变量,使用单引号和双引号则是有区别的.如下面程序: 1 2 3 4 5 6 7 8 &l ...
- 教你如何在iOS项目中设置各种字体
原文地址为: 教你如何在iOS项目中设置各种字体 在iOS开发中设置字体的方法有很多种,下面为大家介绍比较常用的三种方法 1.使用系统默认提供的字体 系统默认提供的字体主要是指UIFont中提供的字体 ...
- linux7系统怎么启动ftp,教你如何在CentOS7系统中配置ftp服务
本文教你如何在CentOS7系统中配置ftp服务. 1.下载vsftpd yum install -y vsftpd 2.设置开机自启动 systemctl enable vsftpd.service ...
- java filter注入_如何在Java Filter 中注入 Service
在项目中遇到一个问题,在 Filter中注入 Serivce失败,注入的service始终为null.如下所示: public class WeiXinFilter implementsFilter{ ...
- HTML如何设置幻灯片大小和位置,PPT教程:教你如何在PPT母版中统一标题的位置、大小、样式 | 演示说...
众所周知,一个PPT的详情页中,会有不同的标题,但是如果要统一每一页标题的位置.大小.样式是非常繁琐的事情.那么如何化繁为简,有没有PPT教程通过几个简单的步骤就解决问题呢?当然有,<PPT母版 ...
- 如何在Android Studio中查看方法信息?
本文翻译自:How can I view method information in Android Studio? In Eclipse, when you hover your mouse ove ...
- 如何在Django模板中注入全局变量
我们在做一些网站项目的时候,可能会遇到需要把某个全局变量注入到所有页面的情况,比如我们做一个在线商城,那么可能需要将用户的资料:比如用户的账号.用户的姓名等注入到每个页面里面. 但是如果用常规的方法, ...
- 数据库直接存图片mysql_教你如何在MySQL数据库中直接储存图片
如果你想把二进制的数据,比如说图片文件和HTML文件,直接保存在你的MySQL数据库,那么这篇文章就是为你而写的!我将告诉你怎样通过HTML表单来储存这些文件,怎样访问和使用这些文件. 本文概述: 在 ...
- 计算机释放磁盘空间常用方法,教您如何在Win7计算机中释放更多磁盘空间
计算机本身是一个大型.尽管容量相对较大,但随着时间的流逝,总会有一天磁盘容量不足.我今天想带给您的win7技巧是如何在win7计算机空间中释放更多磁盘! 首先,我们只是在"我的电脑" ...
最新文章
- weblogic修改java重启_修改weblogic域的jdk
- Spring定时任务注解@Scheduled+@EnableAsync用法详解(简单说明+应用场景+demo源代码+执行过程分析)
- python程序写蛇_python蟒蛇绘制程序
- vba根据内容调整word表格_给你的word提速
- Java高级工程师必看系列,从基础到源码统统帮你搞定
- android 拒绝服务漏洞,Android 应用本地拒绝服务漏洞浅析
- python字典类型可迭代_核心数据类型--字典
- 安装不上vc++环境,导致部分游戏和qq不能用的解决方案
- Linux:UDP Socket编程(代码实战)
- 预加重/去加重/直流滤波
- C语言基础编程题1.0
- 构建系统发育树(进化树)的相关知识,以及各种进化树适用的情况。
- C语言日常学习中遇到的易错情况(2022.11.14)
- 移动端安卓vin码/车架号识别
- 2022-2028年中国眼镜制造行业市场竞争策略及未来发展潜力报告
- 《全程软件测试》读书心得
- 刘鹏计算广告学1:广告的基本知识(一)
- ubuntu破解密码方法
- 简单认识向上转型和向下转型
- Springboot毕设项目医疗云胶片管理系统nem7xjava+VUE+Mybatis+Maven+Mysql+sprnig)
热门文章
- 设计模式篇之——策略设计模式
- 文档相似度之词条相似度word2vec、及基于词袋模型计算sklearn实现和gensim
- selenium之简单使用
- 注意 汇编源程序中,数据不能以字母开头,所以要在数据前面加上0
- OSPF协议将其管理的网络划分为不同类型的若干区域(Area),其中标准区域特点是(64);存根区域(stub)的特点是(65)。【答案】C B
- 2020新款手机,吃鸡贼爽!包邮送一个!
- 基于OpenCV的网络实时视频流传输
- scala基本语言结构以及函数算子(持续更新......)
- web自适应尺寸方法
- 【ZZ】浅谈大型web系统架构 | 菜鸟教程