有什么可能在编译时知道时间和日期(BUILDTIME),以便以可移植的方式在二进制文件(可执行文件/库)中包含有关它们创建时刻的信息?
我们目前有一个使用sh.exe的解决方案,需要在Windows下安装msys,但我想知道是否可以在没有它的情况下安装。
搜索“构建时间/日期”,“编译时间/日期”等内容并未导致任何相关结果。
修改
当我了解__TIME__
时,之后可能会发现此问题:Recording the time when you compile a source
答案 0 :(得分:12)
标准宏__DATE__
和__TIME__
完成工作。
请注意,这将为您提供使用它们的文件的编译日期。不是链接日期。因此,每次构建文件时都必须touch
,或者在MSVC中执行预构建步骤。
6.10.8预定义的宏名称
以下宏名称应由实现定义:
__DATE__
:预处理翻译单元的翻译日期:“Mmm dd”形式的字符串文字 yyyy“,其中月份的名称与生成的月份相同 通过asctime函数,dd的第一个字符是空格 如果值小于10,则为字符。如果翻译日期为 不可用,应提供实施定义的有效日期。__TIME__
:预处理翻译单元的翻译时间:形式为“hh:mm:ss”的字符串文字为 在asctime函数生成的时间内。如果时间 翻译不可用,是实现定义的有效时间 应提供。
我在这里复制了C99文本,但是这些宏比C99要老......我没有找到旧版C的标准文本...
答案 1 :(得分:1)
您可以使用__DATE__
和__TIME__
等宏。这对于Visual Studio也是可移植的(参见http://msdn.microsoft.com/en-us/library/b0084kay(v=vs.80).aspx)
答案 2 :(得分:1)
您可以随时编写一个调用time
和strftime
的5行程序,并将其输出到文件,而不是使用sh
。 [我已经使用这种方法来更新过去的“版本号”和/或“版本号”]。
答案 3 :(得分:1)
除了__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