使用c ++
我在自动计划中编译代码,需要使用代码本身编译代码的时间。目前我只是使用__DATE__
,__TIME__
宏来获取编译时的日期和时间。但是,这会导致二进制文件更改,即使没有对源进行任何更改(宏将在编译时膨胀)这是不好的(我不希望设置认为如果没有更改则二进制更改来源)。
是否可以在不使用会导致源更改的任何方法的情况下获得编译时间?
由于
答案 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编译器调用中
例。但是,当然,这意味着如果包含文件是
改变了,但不是来源,时间和日期不会反映出来
它