如何把编译时间加入到目标文件

在目标文件中嵌入编译时间的技巧
本文介绍了如何确保发布的bin文件与测试通过的版本一致,通过在编译过程中加入时间戳。详细讨论了获取DATA和TIME宏、在不修改代码的情况下更新时间信息的方法,包括修改文件触发重新编译、利用预编译指令和MDK的特殊功能。通过这些方法,可以在每次编译时更新目标文件中的编译时间,确保版本的一致性。

1、问题背景:如何保证发布出去的bin文件是最终测试通过的版本?

Linux入门 一般的来讲,代码到了测试后期,master分支就不会频繁的提交了,并且提交也会更加谨慎。

但是人为操作总会出现纰漏,希望只要代码被重新编译过,那么bin文件就包含新的时间信息,而这个信息是可以从外部通信或printf来查看的。

在嵌入式开发中,版本号一般的都是一个int变量或字符串变量。但是若修改了代码而没有改version变量或宏定义,那么从version上就看不出来文件的变化。

那么最终编译的版本到底是哪个版本,是否与测试的版本完全一致,这个问题尤为突出。

目标文件中带有编译时间可以防止代码被改动过,只要代码被重新编译,那么就生成新的时间信息。

git能够记录文件修改信息,但是调试信息或工程配置等,很多文件都是ignore的,这些信息代表着最终的bin文件的运行环境。

某些复杂bug情况下,只有运行环境一致,仿真器才能attach到目标文件。

2. 如何获取时间:DATA, TIME

这两个宏是日期和时间,格式如下。如果把这两个宏加入到代码,那么就得到了时间的字符串信息。

// Example of __DATE__ string: "Dec 27 2017"// Example of __TIME__ string: "15:06:19"const char *BuildInfo = "Version: " VERSION " " __DATE__ " " __TIME__;

代码实现获取日期和时间的方法很多,比如:

左右滑动查看全部代码>>>

### Linux 下 C/C++ 源代码生成 `.o` 目标文件的方法 #### 使用 GCC 生成 `.o` 文件 在 Linux 环境下,可以通过 `gcc` 或 `g++` 命令来编译 C/C++ 源代码并生成目标文件(`.o`)。为了仅生成目标文件而不进行链接操作,需使用 `-c` 参数。例如: 对于 C 源代码: ```bash gcc -c source.c -o source.o ``` 对于 C++ 源代码: ```bash g++ -c source.cpp -o source.o ``` 这里的关键参数解释如下: - `-c`: 表示仅编译文件目标文件,不进行链接[^1]。 - `-o`: 指定输出的目标文件名。 如果使用的是 `gcc` 来编译 C++ 源代码,则需要额外指定标准库支持,通常通过 `-lstdc++` 实现。 --- #### 使用 Makefile 自动生成 `.o` 文件 当项目规模较大时,推荐使用 `Makefile` 自动化构建过程。以下是一个简单的 `Makefile` 示例,展示如何生成 `.o` 文件以及最终的可执行文件: ```makefile CC = gcc # 定义使用的编译器 CXX = g++ # 如果涉及 C++ 则定义此变量 SRCS = main.c hello.c # 所有的 .c/.cpp 源文件列表 OBJS = $(SRCS:.c=.o) # 将 .c 替换为 .o 得到目标文件列表 TARGET = program # 最终生成的可执行文件名称 all: $(TARGET) $(TARGET): $(OBJS) $(CC) $^ -o $@ # 链接所有 .o 文件生成最终可执行文件 %.o: %.c # 规则:从 .c 文件生成 .o 文件 $(CC) -c $< -o $@ clean: rm -f *.o $(TARGET) # 清理生成的临时文件和可执行文件 ``` 上述 `Makefile` 中的核心部分说明: - `$^` 是指代当前规则的所有依赖项(即所有的 `.o` 文件)。 - `%` 符号表示通配符模式匹配,用于动态处理多个源文件及其对应的目标文件[^2]。 运行命令: ```bash make all ``` 这将依次完成以下任务: 1. 根据 `.c` 文件生成对应的 `.o` 文件; 2. 链接所有 `.o` 文件生成最终的可执行文件 `program`。 清理生成的中间文件和可执行文件可通过以下命令实现: ```bash make clean ``` --- #### 关于静态库的集成 如果项目中还涉及到静态库的使用,可以在链接阶段加入相应的库路径和库名。例如,在 `Makefile` 的链接规则中修改为: ```makefile $(TARGET): $(OBJS) $(CC) $^ -L./libdir -llibrary_name -o $@ ``` 这里的 `-L` 参数指定了库所在的目录,而 `-l` 后跟的是去掉前缀 `lib` 并移除扩展名后的库名[^4]。 --- ### 总结 无论是单独使用 `gcc/g++` 还是借助 `Makefile` 工具链,都可以高效地生成 `.o` 目标文件,并进一步完成项目的整体构建工作。具体方式取决于项目的复杂程度和个人偏好。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值