【问题标题】:getting compile-time date and time without macros获取没有宏的编译时间日期和时间
【发布时间】:2013-07-12 10:29:04
【问题描述】:

使用 C++

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

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

谢谢

【问题讨论】:

  • 除了将其保存在不属于构建的附加文件中之外,我认为这是不可能的......
  • 在这种情况下,您可能希望构建系统仅在有任何更改时才构建。当任何源都没有更改时,仅仅为了重新编译而重新编译没有多大意义。
  • (注意:您应该编辑您的帖子并在宏名称周围添加反引号:“... the `__DATE__`, `__TIME__` macros ...”,因为目前它们显示为粗体且没有下划线)
  • 我喜欢这两个答案;)
  • 所以您想要编译点的日期和时间,但您不希望您的二进制文件根据该信息进行更改?所以这样做的唯一方法是忽略该信息并确保它不用于存储到二进制文件中的任何内容......

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


【解决方案1】:

标准的 __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 variable-将保持不变) .


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

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

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

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

【讨论】:

  • 嗯,这不会仍然导致生成的二进制文件在构建之间发生变化吗?由于timestamp.c文件也会发生变化,并且timestamp.0文件将被链接到二进制文件中?
  • 我需要确保最终的二进制文件不会发生变化,除非源代码发生实际变化。
  • @user1322488 获取他的第一个makefile sn-p,然后通过添加依赖项来修改timestamp.c 行。例如timestamp.c: $(OBJECTS) 这将使它仅在 timestamp.c 比任何对象都旧时重新生成它。
  • 完美运行!感谢大家的帮助!
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-27
      • 1970-01-01
      • 1970-01-01
      • 2010-12-19
      • 2017-12-01
      • 2015-06-12
      • 1970-01-01
      相关资源
      最近更新 更多