Qt和Windows可执行版本信息

时间:2017-12-08 12:45:20

标签: c++ qt versioning

我的Windows Qt小部件应用程序使用" version.h"文件和" RC"文件以针对可执行文件填充版本信息字符串。

version.h看起来像这样......

#ifndef VERSION_H
#define VERSION_H

#define VERSION_MAJOR                           1
#define VERSION_MINOR                           0
#define VERSION_BUILD                           3

#define VER_FILEVERSION           VERSION_MAJOR,VERSION_MINOR,VERSION_BUILD,0
#define STR_FILEVERSION                     VERSION_MAJOR##"."##VERSION_MINOR##"."VERSION_BUILD##".0"

// Keep the product version as fixed
#define VER_PRODUCTVERSION        1.0.0.0
#define STR_PRODUCTVERSION          "1.0.0.0\0"

#define STR_COMPANYNAME                     "MyCompany"
#define STR_FILEDESCRIPTION             "MyFile"
#define STR_INTERNALNAME                    "MyFile"
#define STR_LEGALCOPYRIGHT              "Copyright © 2017 MyCompany"
#define STR_LEGALTRADEMARKS1            "All Rights Reserved"
#define STR_LEGALTRADEMARKS2            STR_LEGALTRADEMARKS1
#define STR_ORIGINALFILENAME            "MyApp.exe"
#define STR_PRODUCTNAME                     "MyApp"

#define STR_COMPANYDOMAIN                   "mywebsite.com"

#endif // VERSION_H

RC文件看起来像:

IDI_APP_ICON    ICON    DISCARDABLE     "MyApp.ico"

#include <windows.h>
#include "version.h"

VS_VERSION_INFO VERSIONINFO
FILEVERSION     VER_FILEVERSION
PRODUCTVERSION  VER_PRODUCTVERSION
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040904E4"
        BEGIN
            VALUE "CompanyName",        STR_COMPANYNAME
            VALUE "FileDescription",    STR_FILEDESCRIPTION
            VALUE "FileVersion",        STR_FILEVERSION
            VALUE "InternalName",       STR_INTERNALNAME
            VALUE "LegalCopyright",     STR_LEGALCOPYRIGHT
            VALUE "LegalTrademarks1",   STR_LEGALTRADEMARKS1
            VALUE "LegalTrademarks2",   STR_LEGALTRADEMARKS2
            VALUE "OriginalFilename",   STR_ORIGINALFILENAME
            VALUE "ProductName",        STR_PRODUCTNAME
            VALUE "ProductVersion",     STR_PRODUCTVERSION
        END
    END

    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x409, 1252
    END
END

为了完整起见,&#34; .pro&#34;文件中包含以下内容:

RC_FILE    = MyApp.rc

这一切似乎都运行正常:当我右键单击exe并转到详细信息选项卡时,我可以看到组合的version.h和RC文件中的版本信息和所有其他字符串。

但是,如果我增加任何一个VERSION_XXX #define值并构建应用程序,我已经注意到报告的&#34;文件版本&#34;没有改变 - 只有当我做了一次&#34;重建&#34;版本是否会改变。

每次我增加版本信息(目前主要是VERSION_BUILD)时,我真的不想进行完全重建,所以我需要做什么才能在每次exe时更新这些信息建成了?

1 个答案:

答案 0 :(得分:1)

问题是qmake不支持RC_FILE的依赖关系。那么可以做些什么呢?

1)最简单,最快捷的方法是使用touch:如果MyApp.rc(几乎)永远不会改变,我们可以强制其时间戳跟随version.h之一。然后是:

  

MyApp.pro

TARGET = MyApp
win*:RC_FILE = $${TARGET}.rc
win*:!build_pass:touch($$RC_FILE, version.h)
# ... more to follow

伴随qmake && make将起到作用。

2)另一个看似简单的解决方案是完全使用RC_FILE,但让qmake自动生成预定义变量的资源脚本:VERSIONQMAKE_TARGET_COMPANYQMAKE_TARGET_DESCRIPTION等。有关完整列表,请参阅qmake Platform Notes

只需将VERSION = x.y.z.n(并删除RC_FILE = MyApp.rc)添加到.pro文件即可启用此功能。

这对于大多数Qt应用程序来说已经足够了,只要它们使用自己的Qt资源系统,而应用程序ICON和VERSIONINFO只需要Windows .rc脚本。

上述例子:

  

version.pri

RC_ICONS = MyApp.ico
VERSION = 1.0.3.0
QMAKE_TARGET_COMPANY = MyCompany
QMAKE_TARGET_DESCRIPTION = MyFile
QMAKE_TARGET_COPYRIGHT = "Copyright © 2017 MyCompany"
QMAKE_TARGET_PRODUCT = MyApp
RC_CODEPAGE = 1252
RC_LANG = 0x0409
  

MyApp.pro

TARGET = MyApp
#win*:RC_FILE = $${TARGET}.rc
win*:include(version.pri)
# ... more to follow

不幸的是,这会带来另一个问题:如果您的C ++源代码树中仍然需要version.h,则必须以某种方式将其与version.pri同步。我认为使用QMAKE_SUBSTITUTES自动生成version.h是最佳选择。但是,添加一堆DEFINES+=...也是一个想法。

3)您可以在.pro文件中创建自定义目标,并自行编译资源脚本。例如:

  

MyApp.pro

TARGET = MyApp
#win*:RC_FILE = $${TARGET}.rc
win* {
    QMAKE_EXTRA_TARGETS += windows_resource
    windows_resource.target = $${TARGET}_res$${first(QMAKE_EXT_OBJ)}
    windows_resource.depends = $${TARGET}.rc version.h
    msvc:windows_resource.commands = $$QMAKE_RC /fo $$windows_resource.target $${TARGET}.rc
    else:windows_resource.commands = $$QMAKE_RC $${TARGET}.rc $$windows_resource.target
    PRE_TARGETDEPS += $$windows_resource.target
    LIBS += $$windows_resource.target
}
# ... more to follow