C++ 在没有宏的情况下获取编译时日期和时间
使用c++ 我按照自动化的时间表编译代码,并且需要使用代码本身编译代码的时间。目前,我只是使用C++ 在没有宏的情况下获取编译时日期和时间,c++,date,time,compiler-construction,macros,C++,Date,Time,Compiler Construction,Macros,使用c++ 我按照自动化的时间表编译代码,并且需要使用代码本身编译代码的时间。目前,我只是使用\uuuu DATE\uuuu,\uuu TIME\uuuu宏来获取编译时的日期和时间。但是,这会导致二进制文件发生更改,即使源代码没有更改(宏将在编译时膨胀),这是不好的(我不希望安装程序认为如果源代码没有更改,二进制文件也会更改) 有没有可能在不使用任何可能导致源代码更改的方法的情况下获取编译时 谢谢标准的\uuuuuuuuuu日期和\uuuuuuu时间宏执行您观察到的操作,返回与时间相关的字符串
\uuuu DATE\uuuu
,\uuu TIME\uuuu
宏来获取编译时的日期和时间。但是,这会导致二进制文件发生更改,即使源代码没有更改(宏将在编译时膨胀),这是不好的(我不希望安装程序认为如果源代码没有更改,二进制文件也会更改)
有没有可能在不使用任何可能导致源代码更改的方法的情况下获取编译时
谢谢标准的
\uuuuuuuuuu日期
和\uuuuuuu时间
宏执行您观察到的操作,返回与时间相关的字符串
它取决于系统(也许还有编译器),尤其是构建系统(比如GNU)
一个可能的想法是链接到一个单独的时间戳文件中,比如(在make
语法中)
然后将重新生成timestamp.o
,并在每次生成时重新链接程序
(因此生成的程序确实会更改,但通过$(对象)
生成变量的大部分代码将保持不变)
或者,您也可以在链接时将日志记录在某个数据库或文本日志文件中,例如
program: $(OBJECTS)
$(LINKER.cc) $^ -o $@ $(LIBES)
date +'$@ built at %c' >> /var/log/build.log
(您可以使用logger
而不是date
将其记录到系统日志中)
然后生成的程序将不会更改,但您将在某个地方记录一个构建时间戳。顺便说一句,您还可以在二进制程序的make
语法中记录一些校验和(例如$(shell md5sum程序)
。如果您在二进制文件中使用编译时,则会对二进制文件进行更改
有几种解决方案,但我认为主要的一点是,如果您定期重建二进制文件,那么只有在实际发生一些更改(无论是对构建系统还是对源代码)的情况下,才应该这样做。因此,将检查是否有更改作为构建系统的一部分,如果没有任何更改,则不要构建任何内容。一个简单的方法是检查源代码版本控制系统中的“最新版本”是什么。如果最新版本与先前版本中使用的版本相同,则无需构建任何内容。这将节省您生成相同的生成(除了生成时间戳),并将解决二进制文件中存储日期和时间的问题 我不清楚你想要什么。如果这是最后一次修改
获取文件的时间取决于您的系统和
构建系统:类似于-D$(shell ls-l
--时间样式=长iso$<| awk'{print$7,$8}')
可以使用
在Linux下使用GNU make调用编译器时
例子。但当然,这意味着如果包含文件
改变了,但不是来源,时间和日期不会反映
它。除了将其保存在一个不属于构建的附加文件中之外,我认为这是不可能的……在这种情况下,您可能希望使构建系统仅在发生任何更改时构建。在没有任何源代码更改的情况下,仅仅为了重新编译而重新编译是没有多大意义的。(注意:您应该编辑帖子,并在宏名称周围添加反勾号:“…日期”,“时间”,“宏…”
”,因为目前它们看起来粗体,没有下划线)我喜欢这两个答案;)所以你想要编译点的日期和时间,但是你不想你的二进制文件根据这些信息改变吗?因此,唯一的方法是忽略这些信息,并确保它没有被用于存储到二进制文件中的任何内容……嗯,这不会仍然导致生成的二进制文件在不同的构建中发生变化吗?由于timestamp.c文件也将更改,timestamp.0文件将链接到二进制文件中?我需要这样做,以使最终的二进制文件不会更改,除非源文件中有实际更改。@user1322488获取他的第一个makefile片段,然后通过添加依赖项来修改timestamp.c行。e、 g.timestamp.c:$(对象)
这将使它仅在timestamp.c比任何对象都旧时重新生成。工作非常完美!谢谢你的帮助!
program: $(OBJECTS)
$(LINKER.cc) $^ -o $@ $(LIBES)
date +'$@ built at %c' >> /var/log/build.log