在编译时可以知道时间和date(BUILDTIME),以便以便携的方式在二进制文件(可执行文件/库)中包含它们创build时刻的信息?
我们目前有一个解决scheme,使用sh.exe,并要求在Windows下安装msys,但我想知道如果没有它可能做。
search诸如“编译时间/date”,“编译时间/date”等事情并没有导致任何相关的结果。
编辑:
当我了解了__TIME__
,就可以发现这个问题曾经被问过: logging你编译一个源代码的时间
标准的宏__DATE__
和__TIME__
宏可以完成这个工作。
请注意,这将为您提供使用文件的编译日期 。 不是链接日期。 因此,每次构建文件时都必须touch
该文件,或者在MSVC中执行预生成步骤。
C99标准说 :
6.10.8预定义的宏名称
下面的宏名称应由实现来定义:
__DATE__
:预处理翻译单元的翻译日期:“Mmm dd yyyy”形式的字符串文字,其月份名称与asctime函数生成的相同,dd的第一个字符是如果值小于10,则为空格。如果翻译日期不可用,应提供实现定义的有效日期。__TIME__
:预处理翻译单元的翻译时间:与asctime函数生成的时间一样,格式为“hh:mm:ss”的字符串文字。 如果翻译时间不可用,应提供实施定义的有效时间。
我在这里复制了C99文本,但是这些宏比C99年代久远…我没有设法找到旧C的标准文本…
你可以像__DATE__
和__TIME__
一样使用宏。 这对于Visual Studio也是可移植的(请参阅http://msdn.microsoft.com/zh-cn/library/b0084kay(v=vs.80).aspx )
你总是可以写一个5行的程序,调用time
和strftime
并把它输出到一个文件,而不是使用sh
。 [我曾用这种方法更新过去的“内部版本号”和/或“版本号”]。
除了__DATE__
和__TIME__
宏之外,您可以使用宏在生成时将值传递给您的程序。
在您的Makefile中,您可以在构建时在宏中传递日期:
gcc -Wall -DBUILD_TIME=`date +%d%m%y_%T` tst.c -o tst
(或使用任何其他date
格式)
然后在你的代码中进行串联:
#define STR(x) STR1(x) #define STR1(x) #x printf("%s\n", STR(BUILD_TIME)); // display build time