在没有宏的情况下获取编译时间日期和时间

getting compile-time date and time without macros

本文关键字:时间 编译 日期 获取 情况下      更新时间:2023-10-16

使用c++

我按照自动计划编译代码,并且需要在代码本身中使用编译代码的时间。目前,我只是使用__DATE____TIME__宏来获取编译时间的日期和时间。然而,即使源代码没有更改,这也会导致二进制文件发生更改(宏在编译时会膨胀),这是不好的(我不希望安装程序认为如果源代码没有任何更改,二进制文件就会发生更改)。

是否可以在不使用任何会导致源代码更改的方法的情况下获得编译时间?

感谢

标准的__DATE____TIME__宏执行您观察到的操作,返回一个与时间相关的字符串。

它取决于系统(也许还有编译器),尤其是构建系统(比如GNU make)。

一个可能的想法是链接到一个单独的时间戳文件中,类似于(在make语法中)

timestamp.c:
        date +'const char timestamp[]="%c";' > $@
program: $(OBJECTS) timestamp.c
        $(LINKER.cc) $^ -o $@ $(LIBES)
        rm -f timestamp.c

然后将重新生成timestamp.o,并在每个make重新链接program(因此生成的程序确实会更改,但大多数代码-通过$(OBJECTS)使变量-将保持不变)。


或者,您可以在链接时登录到某个数据库或文本日志文件中,例如

program: $(OBJECTS)
      $(LINKER.cc) $^ -o $@ $(LIBES)
      date +'$@ built at %c' >> /var/log/build.log

(您可以使用logger而不是date将其记录在系统日志中)

然后生成的program不会更改,但您会在某个地方记录一个构建时间戳。顺便说一句,你也可以记录你的二进制程序的一些校验和(例如make语法中的$(shell md5sum program))。

如果在二进制文件中使用编译时间,则二进制文件将发生更改。

有几种解决方案,但我认为主要的一点是,如果您定期重建二进制文件,那么只有在实际发生了一些更改(无论是对构建系统还是对源代码)的情况下,才应该进行重建。因此,将其作为构建系统的一部分来检查是否有更改,如果没有任何更改,则不要构建任何内容。一个简单的方法是检查源代码的版本控制系统中的"最新版本"。如果最新版本与上一版本中使用的版本相同,则无需构建任何内容。这将节省您生成相同的构建(除了构建时间戳),并将解决二进制文件中存储__DATE____TIME__的问题。

我不清楚你想要什么。如果是最后一次修改文件的时间,获取它将取决于您的系统和构建系统:可以使用类似-D $(shell ls -l --time-style=long-iso $< | awk '{ print $7, $8 }')的东西在Linux下使用GNU make的编译器调用中实例当然,这意味着如果包含文件更改了,但没有更改来源,时间和日期不会反映it.