让你的C程序,可以自动更新版本信息
一、软件管理
稍微上点规模的软件开发往往周期都非常长,
中间会产生很多临时版本,
这些临时版本往往会有各种各样的bug,
由于项目参与的人员众多、水平参差不齐,
软件分支众多、功能复杂,
经常会有各种稀奇古怪的事情发生,
经常遇到一个问题就是:
某个测试版本测出了问题,
但是研发却发现服务器中没有对应的版本与之对应。
有的公司要求所有bug必须有始有终,
一旦bug无法复现,
这时候测试和开发免不了一阵扯皮,
这影响到绩效啊!!!
所以版本管理非常重要。
现在大多数公司软件都是采用git管理,
对于嵌入式软件,
厂家提供的sdk,往往都有git本地仓库,
嵌入式软件一般规模都不大,
所以公司对软件版本管理往往并不会太严格,
很多嵌入式软件工程师都没能养成良好的软件管理习惯。
本文主要讲解如何在编译的时候就给软件自动添加更新软件版本的功能,
程序运行的开始就将版本打印出来,
配合git,更方便的定位软件版本问题。
二、软件版本号
公司的软件版本号往往都比较复杂,
本文为便于读者理解,将版本号的定义精简如下:
仅仅打印版本发布的时间,

后续彭老师会单独在写一篇,一个比较经典的版本号管理实例文章,有兴趣的老铁可以关注下彭老师的号。
三、原理
我们可以定义一个头文件sw_version.h专门存放版本信息的宏,
#define SW_VERSION “2024-09-09-7”
主程序包含该头文件,
并在程序运行的开头位置,打印改宏。
编译 过程中,编译脚本mk.sh自动将当前时间等信息更新到头文件sw_version.h
这样我们编译出的可执行程序app就自带了最新的版本信息。

更新头文件sw_version.h中的内容,我们可以字节编写c程序修改,也可以直接使用命令date,
本文通过后者来讲解。
四、命令date
date选项
date 能用来显示或设定系统的日期和时间:
- 常见选项
--help:显示辅助信息
--version:显示date命令版本信息
-u:显示目前的格林威治时间
-d:做日期时间相关的运算
- - date = 'dateStr' :做时间的相关运算
本文主要用到显示日期和时间的功能:
- 1) 显示系统当前日期时间
[root@hadoop ~]# date
- 2) 以指定格式显示日期时间
[root@hadoop ~]# date '+%Y-%m-%d %H:%M:%S'
执行结果:

date格式标记日期、时间
date 能用来显示或设定系统的日期和时间,在显示方面,使用者能设定欲显示的格式,格式设定为一个加号后接数个标记
日期方面:
%a : 星期几 (Sun..Sat)
%A : 星期几 (Sunday..Saturday)
%b : 月份 (Jan..Dec)
%B : 月份 (January..December)
%c : 直接显示日期和时间
%d : 日 (01..31)
%D : 直接显示日期 (mm/dd/yy)
%h : 同 %b
%j : 一年中的第几天 (001..366)
%m : 月份 (01..12)
%U : 一年中的第几周 (00..53) (以 Sunday 为一周的第一天的情形)
%w : 一周中的第几天 (0..6)
%W : 一年中的第几周 (00..53) (以 Monday 为一周的第一天的情形)
%x : 直接显示日期 (mm/dd/yyyy)
%y : 年份的最后两位数字 (00.99)
%Y : 完整年份 (0000..9999)
时间方面:
%%: 打印出%
%n : 下一行
%t : 跳格
%H : 小时(00..23)
%k : 小时(0..23)
%l : 小时(1..12)
%M : 分钟(00..59)
%p : 显示本地AM或PM
%P : 显示本地am或pm
%r : 直接显示时间(12 小时制,格式为 hh:mm:ss [AP]M)
%s : 从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数
%S : 秒(00..61)
%T : 直接显示时间(24小时制)
%X : 相当于%H:%M:%S %p
%Z : 显示时区
若是不以加号作为开头,则表示要设定时间,而时间格式为
MMDDhhmm[[CC]YY][.ss]
MM 为月份,
DD 为日,
hh 为小时,
mm 为分钟,
CC 为年份前两位数字,
YY 为年份后两位数字,
ss 为秒数
五、脚本实例
脚本实例:
1 #!/bin/bash
2
3 str_front=#define SW_VERSION
4 quotation="\""
5 version_file=sw_version.h
6
7 rm $version_file
8 echo $str_front $quotation$(date '+%Y-%m-%d-%H')$quotation >> $version_file
* 3行:定义环境变量str_front,用于保存字符串 `#define SW_VERSION `
* 4行:定义环境变量quotation,保存字符`"`
* 5行:定义环境变量version_file,保存头文件**sw_version.h**名字
* 7行:删除头文件**sw_version.h**
* 8行:更新最新版本信息到头文件**sw_version.h**
借助date命令拼接成下面字符串
#define SW_VERSION “2024-09-09-7”
将该字符串信息,通过echo命令重定向到头文件**sw_version.h**
>> 表示重定向,信息覆盖
执行结果


大家可以根据自己需要,自己定制自己需要的版本号格式,
同时也可以把该脚本嵌入到自己的编译脚本中。
参考:
https://blog.csdn.net/qq_42246689/article/details/83621262?spm=1001.2014.3001.5506
让你的C程序,可以自动更新版本信息的更多相关文章
- vb脚本自动更新版本信息
使用的串口显示软件为secureCrt,支持脚本功能,今天写了一个简单的软件升级脚本(VB脚本). 如下: # $language = "VBScript" # $interfac ...
- 分析nuget源码,用nuget + nuget.server实现winform程序的自动更新
源起 (个人理解)包管理最开始应该是从java平台下的maven开始吧,因为java的开发大多数是基于开源组件开发的,一个开源包在使用时很可能要去依赖其他的开源包,而且必须是特定的版本才可以.以往在找 ...
- Android应用程序的自动更新升级(自身升级、通过tomcat)(转)
Android应用程序的自动更新升级(自身升级.通过tomcat) http://blog.csdn.net/mu0206mu/article/details/7204746 刚入手android一个 ...
- 【实用篇】Android之应用程序实现自动更新功能
我个人用的是友盟提供的自动更新组件,因此在这里只描述如何实用友盟提供的组件来完成程序的自动更新,步骤如下: 1.登录友盟官网,点击注册一个友盟账号. 2.注册成功后将会自动进入到添加新应用界面,选择添 ...
- 游戏《Minecraft》或其他应用程序 实现 自动更新 客户端版本
本渣又来写(水)博客了. 先说一下,我这个解决方案的安全性并不是企业级的,咱们就是一群穷开服的Minecraft玩家. 如果你要投入到企业级应用(容易被黑客攻击的场景),请自己写,思路凑合看看.不然安 ...
- Windows程序通用自动更新模块(C#,.NET4.5以上)
本通用自动更新模块适合所有Windows桌面程序的自动更新,不论语言,无论Winform还是wpf. 一.工作流程:1. 主程序A调起升级程序B2. B从服务器获取更新程序列表,打印更新信息.3. B ...
- iOS企业版使用第三方实现自动更新版本
1.获取本地版本和互联网版本 NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary]; N ...
- nvidia驱动自动更新版本后问题解决 -- failed to initialize nvml: driver/library version mismatch
因为必须关闭桌面窗口, 建议另外一台电脑ssh连接操作 1. 卸载旧版本并关闭图形界面 sudo apt-get remove --purge nvidia-\* sudo service light ...
- HBuilderX开发app实现自动更新版本
需求说明:使用MUI+Vue等技术并且通过HBuilderX打包开发移动app,在有版本更新时需要自动提示用户有新版本,并且可以点击下载自动安装. 思路说明: 应用打开时(使用Vue的生命周期mo ...
- npm安裝、卸載、刪除、撤銷發佈包、更新版本信息
利用npm安裝包: 全局安裝:npm install -g 模塊安裝 局部安裝(可以使用repuire(‘模塊名’)引用):npm install 模塊名稱 如果權限不夠,就是用管理員方式安裝. 本地 ...
随机推荐
- Spark Structured Streaming(二)实战
5. 实战Structured Streaming 5.1. Static版本 先读一份static 数据: val static = spark.read.json("s3://xxx/d ...
- QT学习:10 IO类
--- title: framework-cpp-qt-10-IO类 EntryName: framework-cpp-qt-10-QIODevice date: 2020-04-17 10:24:0 ...
- 『vulnhub系列』BEELZEBUB- 1
『vulnhub系列』BEELZEBUB- 1 下载地址: https://www.vulnhub.com/entry/beelzebub-1,742/ 信息搜集: 使用nmap扫描存活主机,发现主机 ...
- SpringBoot+mail 轻松实现各类邮件自动推送
一.简介 在实际的项目开发过程中,经常需要用到邮件通知功能.例如,通过邮箱注册,邮箱找回密码,邮箱推送报表等等,实际的应用场景非常的多. 早期的时候,为了能实现邮件的自动发送功能,通常会使用 Java ...
- zip-zip(子函数调用)
题目 监听服务器端口,得到题目如下: 源码解析 主函数 主函数中是题目界面的逻辑,对应于用户的选择做出相应的操作,其中需要注意的是选项2,解压操作需要获得root权限(uid==0). 选项1,2:文 ...
- (Java)日志框架体系整理
# JUL 指的是Java Util Logging包,它是Java原生的日志框架,使用时不需要另外引用第三方的类库,相对其他的框架使用方便,学习简单,主要是使用在小型应用中.@紫邪情 # JUL的组 ...
- 韦东山freeRTOS系列教程之【第三章】任务管理
目录 系列教程总目录 概述 3.1 基本概念 3.2 任务创建与删除 3.2.1 什么是任务 3.2.2 创建任务 3.2.3 示例1: 创建任务 3.2.4 示例2: 使用任务参数 3.2.5 任务 ...
- 开源GTKSystem.Windows.Forms框架让C# winform支持跨平台运行
目录 一.简介 二.GTKSystem.Windows.Forms框架的优势 三.支持界面皮肤主题定制 四.多种控件支持 五.支持Dock.Anchor.SplitContainer布局缩放 六.支持 ...
- Oracle 字符串分割,并将内码转中文(简单实现),项目实战
导读 实际项目开发过程中,可能会遇到这种情况,A表中A1字段存储B表中的内码如(1,2,3),此时需要将A表中的A1字段转中文,为了方便理解,我们这里创建学生表和老师表,一个学生对应N个老师. 创建表 ...
- 洛谷P5020
水一道绿题... #include<iostream> #include<utility> #include<algorithm> using namespace ...