在没有宏的情况下获取编译时间日期和时间
getting compile-time date and time without macros
使用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
,并在每个make
重新链接program
(因此生成的程序确实会更改,但大多数代码-通过$(OBJECTS)
使变量-将保持不变)。
或者,您可以在链接时登录到某个数据库或文本日志文件中,例如
program: $(OBJECTS)
$(LINKER.cc) $^ -o $@ $(LIBES)
date +'$@ built at %c' >> /var/log/build.log
(您可以使用logger
而不是date
将其记录在系统日志中)
然后生成的program
不会更改,但您会在某个地方记录一个构建时间戳。顺便说一句,你也可以记录你的二进制程序的一些校验和(例如make
语法中的$(shell md5sum program)
)。
如果在二进制文件中使用编译时间,则二进制文件将发生更改。
有几种解决方案,但我认为主要的一点是,如果您定期重建二进制文件,那么只有在实际发生了一些更改(无论是对构建系统还是对源代码)的情况下,才应该进行重建。因此,将其作为构建系统的一部分来检查是否有更改,如果没有任何更改,则不要构建任何内容。一个简单的方法是检查源代码的版本控制系统中的"最新版本"。如果最新版本与上一版本中使用的版本相同,则无需构建任何内容。这将节省您生成相同的构建(除了构建时间戳),并将解决二进制文件中存储__DATE__
和__TIME__
的问题。
我不清楚你想要什么。如果是最后一次修改文件的时间,获取它将取决于您的系统和构建系统:可以使用类似-D $(shell ls -l
--time-style=long-iso $< | awk '{ print $7, $8 }')
的东西在Linux下使用GNU make的编译器调用中实例当然,这意味着如果包含文件更改了,但没有更改来源,时间和日期不会反映it.
- 使用简单类型列表实现的指数编译时间.为什么
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 在已经使用Git的情况下减少编译时间
- C++常量数组的编译时间较长
- 编译时间文本到数字转换 (atoi)
- 在C++中执行 N 阶乘编译时间的 3 种不同/相同方法
- 为什么具有静态存储持续时间的同一内联变量在包含在 VS2017 编译的两个翻译单元中时会构造和销毁两次
- DLLexport 类模板实例(专用化),减少了仅标头模板库的编译时间
- 为什么这段代码需要这么长时间才能用 g++ 编译?
- 替换枚举以最大化编译时间检查的最佳方法
- 不同C++功能的编译时间
- 在预编译标头中实例化模板会缩短编译时间吗?
- 使用 SCons 提取每个编译单元的编译时间
- 将 lambda 函数转换为另一个编译单元中的普通函数会缩短编译时间吗?
- std :: Invoke_result_t编译时间语法错误
- variadic函数模板:基于n编译时值在运行时间自动n输入
- 模板;constexpr;编译时间
- 如何实现声明功能-C 11,编译时间
- 如何减少编译时间:在包含未触及的头文件的情况下
- 当(执行时间)>>>(编译时间)时,多个编译单元是否仍然值得?