获得没有宏的编译时日期和时间

时间:2013-07-12 10:29:05

标签: c++ date time compiler-construction macros

使用c ++

我在自动计划中编译代码,需要使用代码本身编译代码的时间。目前我只是使用__DATE____TIME__宏来获取编译时的日期和时间。但是,这会导致二进制文件更改,即使没有对源进行任何更改(宏将在编译时膨胀)这是不好的(我不希望设置认为如果没有更改则二进制更改来源)。

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

由于

3 个答案:

答案 0 :(得分:3)

标准__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,并且program会在每make重新链接(因此生成的程序确实会更改,但大部分代码都会$(OBJECTS)变量 - 将保持不变)。


或者,您可以例如在链接时记录一些数据库或文本日志文件,例如

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

(您可以使用logger代替date来获取系统日志中记录的内容)

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

答案 1 :(得分:0)

如果您在编译时使用二进制文件,那么您将进行二进制更改。

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

答案 2 :(得分:0)

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