两只袜子 发表于 2025-2-10 14:49

让你的C程序,自动打印版本信息

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

两只袜子 发表于 2025-2-10 14:50

本帖最后由 两只袜子 于 2025-2-10 14:52 编辑

三、原理 我们可以定义一个头文件sw_version.h专门存放版本信息的宏,#define SW_VERSION “2024-09-09-7”
主程序包含该头文件,并在程序运行的开头位置,打印改宏。编译 过程中,编译脚本mk.sh自动将当前时间等信息更新到头文件sw_version.h这样我们编译出的可执行程序app就自带了最新的版本信息。https://mmbiz.qpic.cn/sz_mmbiz_png/icRxcMBeJfcicgic9Cr8ycYdfbjC2tx2dEuR2oDjpzMZPcxM23yVicOrZPRJmjf5dccvjJ9ib6QTWBwpx4kver3lP5w/640?wx_fmt=png&from=appmsg更新头文件sw_version.h中的内容,我们可以字节编写c程序修改,也可以直接使用命令date,本文通过后者来讲解。四、命令date date选项date 能用来显示或设定系统的日期和时间:
[*]常见选项
--help:显示辅助信息
--version:显示date命令版本信息
-u:显示目前的格林威治时间
-d:做日期时间相关的运算
- - date = 'dateStr' :做时间的相关运算
本文主要用到显示日期和时间的功能:
[*]1)显示系统当前日期时间
@hadoop ~]# date

[*]2)以指定格式显示日期时间
@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 M)

%s : 从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数

%S : 秒(00..61)

%T : 直接显示时间(24小时制)

%X : 相当于%H:%M:%S %p

%Z : 显示时区
若是不以加号作为开头,则表示要设定时间,而时间格式为 MMDDhhmm[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**
      >> 表示重定向,信息覆盖

两只袜子 发表于 2025-2-10 14:53

执行结果
大家可以根据自己需要,自己定制自己需要的版本号格式,同时也可以把该脚本嵌入到自己的编译脚本中。

huahuagg 发表于 2025-2-21 18:33

是不是要定义一个宏啊。然后打印

wang6623 发表于 2025-2-22 17:19

产生很多临时版本

初级工程渣 发表于 2025-2-22 18:17

版本管理是一个非常重要但容易被忽视的环节

初级工程渣 发表于 2025-2-22 18:32

通过Git和编译脚本,可以在编译时自动生成版本号,并将其嵌入到程序中。

wahahaheihei 发表于 2025-2-26 19:36

如果用上述的方式定义版本,那版本号是不连续的了。

自动化陈稳 发表于 2025-4-27 00:55

通常情况下,版本号可以选择简化,甚至只关注发布版本的时间戳或其他更简单的标识方法,以方便开发人员进行快速定位和调试。
页: [1]
查看完整版本: 让你的C程序,自动打印版本信息