我的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时更新这些信息建成了?
答案 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
自动生成预定义变量的资源脚本:VERSION
, QMAKE_TARGET_COMPANY
,QMAKE_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