5

使用 C++

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

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

谢谢

4

3 回答 3

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)make 变量 - 将保持不变)。


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

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

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

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

于 2013-07-12T10:35:10.363 回答
0

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

有几种解决方案,但我认为主要的一点是,如果您定期重建二进制文件,那么只有在确实有一些更改(构建系统或源代码)时才应该这样做。所以让它成为你构建系统的一部分来检查是否有变化,如果没有任何变化就不要构建任何东西。一个简单的方法是检查源代码的版本控制系统中的“最新版本”是什么。如果最新版本与之前构建中使用的版本相同,则无需构建任何内容。这将节省您生成相同的构建(除了构建时间戳),并将解决 storgin__DATE____TIME__二进制文件的问题。

于 2013-07-12T11:05:43.870 回答
0

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

于 2013-07-12T11:40:16.060 回答