Qt,Linux,添加构建日期和时间定义

5

我想在我的应用程序中获取构建日期和时间,以便在关于页面中显示。

在我的pro文件中,我有:

    DEFINES += "BUILDDATE=$$system(date +'%d-%m-%y %T')"

我已经在系统终端中使用了日期命令,并且它能够正常工作。

在我的源代码中:

    QString strBldDate(BUILDDATE);

所有内容都编译通过了,但在调试时我发现strBldDate为空。

从讨论中得知可以在“.pro”文件中使用message()函数来显示消息,例如:

    message($$system(date +"'%d-%m-%y %T'"))

这很有效,当我构建时,会得到类似于以下内容的结果:
    Project MESSAGE: 26-06-19 10:34:59

但是我该如何使用它来验证定义内容呢?

    message(BUILDDATE)

在我上述的努力下,最终的结果如下:
    Project MESSAGE: BUILDDATE

message($$system(date +'%d-%m-%y %T')) 显示什么?实际上,message(date +'%d-%m-%y %T') 显示什么? - Martin Bonner supports Monica
@MartinBonner,有趣的是在Qt Creator中我收到了日期格式的警告,但是如果我复制“date +'%d-%m-%y %T'”并粘贴到终端中,它就可以工作了。仅从运行结果来看:26-06-19 08:41:22 - SPlatten
另外,如果您使用 BUILDDATE = $$system(date +'%d-%m-%y %T')DEFINES += "BUILDDATE=$$BUILDDATE",它是否有效? - Martin Bonner supports Monica
SPlatten - Qt Creator 可能将日期格式视为 printf 字符串,因此无效。 - Martin Bonner supports Monica
@MartinBonner,现在尝试一下,那会做什么? - SPlatten
显示剩余3条评论
2个回答

8
您可以在GCC和MSVC中使用标准预定义宏来实现此目的。以下是GCC中的预定义宏列表:3.7.1 标准预定义宏。而对于MSVC,则是这样的:预定义宏。代码看起来可能像这样:
QString datetime = QStringLiteral(__DATE__) + QStringLiteral(" ") + QStringLiteral(__TIME__);

如果您无法使用预定义宏,请不要在定义中使用空格,并使用反斜杠引号进行包装,如下所示:

DEFINES += BUILDDATE=\\\"$$system( date "+%d.%m.%Y_%H:%M:%S" )\\\"

strBldDate.replace(QChar('_'), QChar(' '));

编辑: 创建 builddatetime.h 文件,并在需要构建版本的任何地方包含它:

#ifndef BUILDDATETIME_H
#define BUILDDATETIME_H

#include <QString>
const QString BUILDV =  QStringLiteral(__DATE__ " " __TIME__);

#endif // BUILDDATETIME_H

在你的 .pro 文件中添加 builddatetime.h 到头文件中 (HEADERS += builddatetime.h),并加入下面的几行代码:
buildtimeTarget.target = builddatetime.h
buildtimeTarget.depends = FORCE
buildtimeTarget.commands = touch $$PWD/builddatetime.h
PRE_TARGETDEPS += builddatetime.h
QMAKE_EXTRA_TARGETS += buildtimeTarget

这会涉及到builddatetime.h文件以及所有包含此头文件的cpp文件将在每次构建和运行命令时重新构建。


关于这种方法需要注意的重要事项是:它将获取特定编译单元上次构建的日期。因此,如果没有更改,它将不会重新构建,时间和日期也不会更改。这可以通过使用* touch rm *或在必要时进行干净的构建来解决。 - hyde
@hyde,没错。这可以通过make的--always-make选项或PHONY/FORCE来解决。或者只需在Qt的.pro文件中添加Pre-Build事件即可。 - Xplatforms
这不是我要找的解决方案,因为__DATE__和__TIME__仅与它们所用的源模块有关,我想要整个项目的构建日期和时间。 - SPlatten
1
__DATE____TIME__是标准宏,因此无需指向特定编译器的文档,只需指向C++草案文本中的__DATE____TIME__即可。此外,最好使用文字串联而不是创建多个QStringLiteral并将它们operator+起来:QStringLiteral(__DATE__ " " __TIME__) - Ruslan
实际上,如果我在构建解决方案之前总是清理项目,那么__DATE__和__TIME__可能是更好的解决方案。 - SPlatten
1
@SPlatten,我已经为qmake pro文件添加了解决方案,以便在每次运行/构建时重新生成“版本”。 - Xplatforms

0
对于想在Windows上实现同样效果的用户,可以使用@Xplatforms的解决方案,但需使用不同的命令,并配合使用builddatetime.h文件。
WIN_PWD=$$replace(PWD, /, \\)

buildtimeTarget.target = builddatetime.h
buildtimeTarget.depends = FORCE
buildtimeTarget.commands = copy /b $$WIN_PWD\builddatetime.h+,,$$WIN_PWD\builddatetime.h
PRE_TARGETDEPS += builddatetime.h
QMAKE_EXTRA_TARGETS += buildtimeTarget

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接