在Visual C ++可执行文件中输出编译时间戳?

时间:2008-08-25 08:28:20

标签: c++ visual-c++ execution compile-time

如何将编译时间戳信息插入到使用Visual C ++ 2005构建的可执行文件中?我希望能够在执行程序时输出类似的内容:

  

此版本XXXX编译为dd-mm-yy,hh:mm。

其中日期和时间反映了项目构建的时间。除非重新编译,否则它们不应随着程序的每次连续调用而改变。

6 个答案:

答案 0 :(得分:19)

虽然不是您的确切格式, DATE 的格式为Mmm dd yyyy,而 TIME 的格式为hh:mm:ss。您可以创建一个这样的字符串,并在任何对您有意义的打印例程中使用它:

const char *buildString = "This build XXXX was compiled at " __DATE__ ", " __TIME__ ".";

(注意另一个答案: TIMESTAMP 仅吐出源文件的修改日期/时间,而不是构建日期/时间。)

答案 1 :(得分:7)

__DATE__ 
__TIME__

预定义为C99标准的一部分,因此应该可供您使用。它们与预处理器一起运行一次。

答案 2 :(得分:5)

嗯......对于Visual C ++,有一个名为__ImageBase的内置符号。具体做法是:

EXTERN_C IMAGE_DOS_HEADER __ImageBase;

您可以在运行时检查它以确定PE头中的时间戳:

const IMAGE_NT_HEADERS *nt_header= (const IMAGE_NT_HEADERS *)((char *)&__ImageBase + __ImageBase.e_lfanew);

使用nt_header->FileHeader.TimeDateStamp获取时间戳,即1970年1月1日起的秒数。

答案 3 :(得分:4)

__TIME____DATE__可以正常工作,但有一些复杂情况。

如果将这些定义放在.h文件中,并包含多个.c / .cpp文件中的定义,则每个文件的日期/时间版本将根据编译时的不同而不同。因此,如果您希望在两个不同的地方使用日期/时间并且它们应始终匹配,那么您就遇到了麻烦。如果您正在进行增量构建,则可能会重建其中一个文件而另一个文件不会重建,这会再次导致时间戳可能会大不相同。

稍微好一点的方法是在.h文件中生成GetBuildTimeStamp()原型,并将__TIME____DATE__宏放在实现(.c / .cpp)文件中。这样,您可以在代码中的多个位置使用时间戳,它们将始终匹配。但是,您需要确保每次执行构建时都重建.c / .cpp文件。如果您正在进行干净的构建,那么此解决方案可能适合您。

如果您正在进行增量构建,那么您需要确保在每次构建时更新构建标记。在Visual C ++中,您可以使用PreBuild步骤执行此操作 - 但是在这种情况下,我建议您使用基于文本的文件,而不是在已编译的.c / .cpp文件中使用__DATE____TIME__。在程序执行期间在运行时读取。这使得构建脚本可以快速更新时间戳(无需编译或链接),并且不需要PreBuild步骤来理解编译器标志或选项。

答案 4 :(得分:1)

我认为,使用 DATE TIME TIMESTAMP 的建议解决方案就足够了。我建议保持触摸程序包含在预构建步骤中,以便触摸保存预处理器变量的文件。触摸文件可确保其时间戳比上次编译时更新。这样,编译文件中的日期/时间也会随着每次重建而改变。

答案 5 :(得分:-1)

Visual C ++也支持__TIMESTAMP__,这几乎就是您所需要的。话虽如此,关于构建时间戳的困难部分是让它们保持最新,这意味着要编译每次重建时使用__TIMESTAMP__的文件。不确定是否有办法在Visual C ++中设置它。