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

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

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

===============>>#1 票数:19

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

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

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

===============>>#2 票数:7

__DATE__ 
__TIME__

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

===============>>#3 票数: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来获取时间戳,即从nt_header->FileHeader.TimeDateStamp日起的秒数。

===============>>#4 票数:4

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

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

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

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

===============>>#5 票数:1

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

===============>>#6 票数:-1

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

  ask by translate from so

未解决问题?本站智能推荐:

1回复

如何在Visual C ++编译期间输出编译时数字常量?

Visual C ++有#pragma message ,它将字符串输出到编译器输出中 。 现在我有一家工厂: 我想将传递给new的类的大小(即sizeof( CComObject<Type> )输出到编译器输出中。看起来#pragma message只接受字符串。
1回复

编译时将wchar缩小为char

在我的编译时函数中,我想使用字符串。 ANSI和WIDE两者。 因此,我添加了一个快速模板来处理这两种情况。 这一切都很容易,但是我有一个特殊的函数可以计算字符串的安全校验和。 这可以在字节数组上工作,并且要花费大量精力重写才能在可变缓冲区大小上工作,所以我想我只是将wchar缩小为ch
2回复

wxWidgets在编译时包含图像

我一直在尝试制作一个简单的wxWidgets程序,只带有一个带有图片的按钮。 我已经能够很轻松地使带有图像的按钮,但是包含它时出现了我的问题。 到目前为止,我只能在运行时获取图像(该图像必须与.exe文件位于同一文件夹中;否则,我会收到错误2:系统找不到指定的文件)。 使用这种方法,我
1回复

使用多种类型时,可以减少我的编译时间吗?

让我们坚持一个文件和一个标题。 我生成的标头中包含很多信息,并且我制作了该标头的简化版本,其中删除了许多方法。 标头从6k行增加到3k。 这是一个类在light header中的外观示例 我尝试编译相同的文件,它从8秒变为7秒...不是我想要的结果。 我在想也许大部分的编
5回复

说服C#编译器在成员返回后执行将停止

我不认为这是目前可行的,或者它是否是一个好主意,但这是我刚才想到的。 我使用MSTest对我的C#项目进行单元测试。 在我的一个测试中,我执行以下操作: 为了使这个代码编译,我必须在其声明或catch块中为instance赋值。 我可以选择在Assert.Fail之后return
1回复

为什么constexpr在编译时没有评估(MSVC 2015)?

最近我试图利用MSVC 2015下的C ++ 0x constexpr,我的目标是实现编译时哈希字符串。 我编写了一个简单的FNV-1a哈希算法作为constexpr函数,根据需要使用单个return语句(三元运算符)并仅调用constexpr函数,这里它是: 我还做了一个小宏,能够毫
1回复

在已编译的可执行文件的.text节中增加或指定间隙以手动添加汇编代码

我几乎没有在汇编级别修改应用程序的经验,而无需重新编译它们。 首先,我必须找到一个足够大的间隙,该间隙在运行时不会改变,添加一些代码,并修改现有代码以执行新代码。 但是并不能保证找到新代码的可用空间,也许有一种生成方法? 我已经用c ++创建了一个模板代码,当然,我已经对其进行了编译,
2回复

kdevelop没有指定有效的可执行文件

我刚安装了kdevelop 4.1,然后创建了一个普通的hello世界,build是可以的,但是当我按下执行它给我(没有指定有效的可执行文件)任何想法?
1回复

有什么办法可以在网站上运行Visual C ++项目

我想创建一个网站并运行一个使用Visual C ++ 2008 Expression创建的项目。 我到处都读到,不可能让exe文件直接在网站上运行,而只是存储它并提供下载的可能性。 现在我的问题是:是否有可能直接在网站上运行用Vc ++构建的项目,例如在带有Windows托管的网站上运行
1回复

为什么Visual C ++编译器将未使用的类编译为可执行文件?

我可能会误解编译器的工作方式,但是我遇到以下情况。我有一个VC ++ 2012项目。该项目包含具有数百个类的API。现在,我创建了“ main”入口点文件,其中仅使用了一些std的东西。主要的甚至不包含来自API的单个标头,但是当我编译时,我看到API的几乎所有内容都被编译为可执行文件了,为什么会发