10

在编译时知道时间和日期(BUILDTIME)的可能性是什么,以便以可移植的方式将有关它们创建时刻的信息包含在二进制文件(可执行文件/库)中?

我们目前有一个使用 sh.exe 的解决方案,并且需要在 Windows 下安装 msys,但我想知道是否可以不使用它。

搜索诸如“构建时间/日期”、“编译时间/日期”之类的内容并没有得到任何相关结果。

编辑:

当我了解__TIME__时,可能会发现之前有人问过这个问题:Recording the time when you compile a source

4

4 回答 4

12

标准宏__DATE____TIME__完成工作。

请注意,这将为您提供使用它们的文件的编译日期。不是链接日期。因此,您必须touch在每次构建该文件时,或在 MSVC 中执行预构建步骤。

C99 标准说

6.10.8 预定义的宏名称

以下宏名称应由实现定义:

  • __DATE__: 预处理翻译单元的翻译日期:“Mmm dd yyyy”形式的字符串文字,其中月份的名称与asctime函数生成的月份名称相同,dd的第一个字符为空格如果值小于 10,则为字符。如果翻译日期不可用,则应提供实现定义的有效日期。
  • __TIME__:预处理翻译单元的翻译时间:形式为“hh:mm:ss”的字符串文字,如asctime函数生成的时间。如果翻译时间不可用,则应提供实现定义的有效时间。

我在这里复制了 C99 文本,但这些宏比 C99 旧得多......我没有设法找到旧 C 的标准文本......

于 2013-06-25T08:48:02.037 回答
1

您可以使用 和 之类__DATE__的宏__TIME__。这对于 Visual Studio 也是可移植的(参见http://msdn.microsoft.com/en-us/library/b0084kay(v=vs.80).aspx

于 2013-06-25T08:48:31.040 回答
1

您始终可以编写一个 5 行程序来调用time并将strftime其输出到文件,而不是使用sh. [我过去曾使用这种方法更新“内部版本号”和/或“版本号”]。

于 2013-06-25T08:49:29.837 回答
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
于 2013-06-25T08:55:45.140 回答