使用 C++
我按照自动计划编译我的代码,并且需要在代码本身中使用编译代码的时间。目前我只是使用__DATE__
,__TIME__
宏来获取编译时间的日期和时间。但是,即使没有对源代码进行任何更改(宏将在编译时膨胀),这也会导致二进制文件发生更改,这是不好的(如果没有更改,我不希望设置认为二进制文件已更改到源头)。
是否可以在不使用任何会导致源更改的方式的情况下获得编译时间?
谢谢
使用 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
将重新生成,并且您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
)。
如果您在二进制文件中使用编译时,那么您将获得二进制更改。
有几种解决方案,但我认为主要的一点是,如果您定期重建二进制文件,那么只有在确实有一些更改(构建系统或源代码)时才应该这样做。所以让它成为你构建系统的一部分来检查是否有变化,如果没有任何变化就不要构建任何东西。一个简单的方法是检查源代码的版本控制系统中的“最新版本”是什么。如果最新版本与之前构建中使用的版本相同,则无需构建任何内容。这将节省您生成相同的构建(除了构建时间戳),并将解决 storgin__DATE__
和__TIME__
二进制文件的问题。
我不清楚你想要什么。如果它是文件的最后修改时间,那么获取它将取决于您的系统和构建系统:例如-D $(shell ls -l
--time-style=long-iso $< | awk '{ print $7, $8 }')
,可以在 Linux 下的 GNU make 编译器调用中使用类似的东西。但是,当然,这意味着如果包含文件被更改,但不是源,时间和日期不会反映它。