1。问题背景:如何保证发布的bin文件是最终测试通过的版本?一般来说,代码到了测试后期,不会频繁提交master分支,提交会比较谨慎。但是,人的操作总会出错。我希望只要重新编译代码,bin文件中就会包含新的时间信息,并且可以通过外部通信或者printf查看这些信息。在嵌入式开发中,版本号一般是一个int变量或者一个string变量。但是如果修改了代码,没有改变版本变量或者宏定义,那么从版本上是看不到文件变化的。那么最终编译出来的版本是哪个版本,和测试版本是否一模一样,这个问题就显得尤为突出。目标文件中的编译时间可以防止代码被改动,只要重新编译代码,就会产生新的时间信息。Git可以记录文件修改信息,但是调试信息或者项目配置等很多文件都被忽略了,而这些信息代表了最终bin文件的运行环境。对于一些复杂的bug,只有运行环境一致,模拟器才能attach到目标文件。2.如何获取时间:DATA、TIME这两个宏是日期和时间,格式如下。如果在代码中加入这两个宏,那么就得到了时间的字符串信息。//__DATE__字符串示例:"Dec272017"//__TIME__字符串示例:"15:06:19"constchar*BuildInfo="Version:"VERSION""__DATE__""__TIME__;获取日期时间的代码实现方法有很多,比如:左右滑动查看所有代码>>>unsignedintmk_Build_Date(void){intyear=0,month=0,day=0;int小时=0,分钟=0,秒=0;字符m[4]={0};sscanf(__DATE__,"%3s%2d%4d",m,&day,&year);for(month=0;month<12;month++){if(strcmp(m,short_char_months[month])==0){中断;}}sscanf(__TIME__,"%2d:%2d:%2d",&hour,&minute,&seconds);#ifdefSHORT_DATA_CHAR__printf([null]**Buildat:\t%04u-%02u-%02us%02u:%02u:%02u\n",year,month,day,hour,minute,seconds);#elseprintf("[null]**构建于:\t%04u-%02u-%02u%02u:%02u:%02u\n",年月日时分秒);#endifDEBUG("构建日期:%s%s\n",__DATE__,__TIME__);return0;}在代码中加入上面的函数,可以得到工程编译时间,但是如果代码所在的文件没有被修改,在非-build-all在某些情况下,编译器不会再次编译这个文件,所以时间信息不会被更新,如果每次都使用re-buildall,会很麻烦,而且不保证你会记住每次都点击buildall按钮,靠技术手段保证每次build都更新时间信息是正确的方法3.如何保证每次编译都更新时间:使用预编译指令更新每次包含时间宏的文件或者对应的链接文件。在IAR环境下,官方给出了解决方案(Usingpre-buildactionsfortimestamping)。https://www.iar.com/support/t。..方法一:修改文件时间,导致编译器对文件进行重新编译cmd/c"touch/cygdrive/d/test.c"方法不错,可惜IAR用户大多是Windows用户,包括我,touch是一个linux命令,需要Cywin环境。如果你已经安装了这个环境,你就完成了。Cygwintouch命令如果环境变量PATH包含“cygwin-application.exe”所在的目录,则可以在构建前和构建后的命令行中输入“cygwin-application.exe”。您可以在预构建命令行上运行Cygwin命令“touch”,但是如果您添加文件路径,例如“touchd:/test.c”,Cygwin将不接受该文件路径。Cygwin需要POSIX路径/cygdrive/d/test.c,因此生成的命令行将是“touch/cygdrive/d/test.c”,但是此命令不能直接在构建前和构建后命令上执行。相反,您必须使用间接运行:cmd/c"touch/cygdrive/d/test.c".bat文件(位于项目目录中)替代方案如下所示:预构建命令行:$PROJ_DIR$\pre-build.batFilepre-build.bat:touch/cygdrive/d/test.c方法二:修改文件对应的链接文件,触发编译器重新编译文件,生成新的链接文件,然后生成新的目标文件将生成时间信息。“touch”命令的替代方法是具有删除目标文件的预构建操作,例如预构建命令行:预构建中的cmd/c"del"$OBJ_DIR$\te??st.o""添加上面的命令会在编译前删除test.o文件。在这种模式下,只要项目代码的任何一个位置发生变化,重新编译代码,就会触发删除test.o,然后链接过程发现没有test.o文件,就会重新编译test.c,然后将新的时间信息记录下来。虽然有点曲线救国的味道,但还是顺利达到了目的。只要项目中任何地方发生变化,都会生成新的目标文件,目标文件就会有最新的编译时间。方法三:更直接的告诉编译器每次重新编译某个文件,MDK支持这个功能。时隔一年半再次来到这里,发现那时的自己还是一个新手,为自己的曲线救国而自豪,其实是看远了。如果你对工具比较了解,你肯定不会用上面的方法。当然,上面的方法也是一个大概的思路,一个通用的知识点,容易想到,也能达到目的。新方法不需要编写任何脚本。如果你想让代码每次都编译更新DATA和TIME宏,那么就让这个文件每次都编译一次。不需要删除它的obj文件,让编译器直接告诉编译器每次找不到文件就重新编译,触发重新编译。MDK支持这个功能。下面是测试的效果:以上就是良虚教程网为各位小伙伴分享的目标文件如何添加编译时间。以上就是良序教程网为各位小伙伴们分享的Linux相关知识。
