简述
qmake 可以随意地自动生成一个适当填充的 Windows 资源文件。本节主要讲解如何用 qmake 处理一个 Windows 资源文件,并将其链接到一个可执行应用程序(EXE)或动态链接库(DLL)。
详细说明
一个链接的 Windows 资源文件包含许多元素,可以由其 EXE 或者 DLL 来访问。然而,Qt 资源系统应当以独立于平台的方式访问链接资源。但在链接的 Windows 资源文件中,有一些标准元素只能由 Windows 自身访问。例如,在 Windows 资源管理器中,文件属性的“详细信息”需要由资源元素填充。此外,EXE 的程序图标也需要从这些元素中读取。所以,对于一个由 Qt 创建的 Windows EXE 或 DLL 来说,要同时使用这两项技术,比较好的实践方法是:通过 Qt 资源系统链接独立于平台的资源,并通过一个 Windows 资源文件添加 Windows 的特定资源。
通常情况下,一个资源定义脚本(.rc 文件)被编译成一个 Windows 资源文件。在微软的工具链内部,RC 工具生成一个 .res 文件,该文件可以被微软链接器链接到一个 EXE 或 DLL;MinGW 工具链使用 windres 工具生成一个 .o 文件,该文件可以被 MinGW 链接器链接到一个 EXE 或 DLL。
生成 .rc 文件
通过设置系统变量 VERSION
或 RC_ICONS
(至少一个),qmake 会自动生成 .rc 文件。
以 VERSION
为例,在 pro 中添加版本信息:
VERSION = 4.0.2.666
执行 qmake,这时,会在 build 目录下生成一个名为 MyApp_resource.rc 的文件,生成的 .rc 文件会被自动编译和链接。
执行 Build(构建),会生成对应的 MyApp_resource.res 文件(已编译的资源脚本)。
可以看到,生成 .rc 文件的同时,会适当的填充元素,而这些元素由系统变量QMAKE_TARGET_COMPANY
、QMAKE_TARGET_DESCRIPTION
、QMAKE_TARGET_COPYRIGHT
、QMAKE_TARGET_PRODUCT
、RC_CODEPAGE
、RC_ICONS
、RC_LANG
、和 VERSION
所决定。
如果这些元素不满足需要,qmake 还提供了两个系统变量:RC_FILE
和 RES_FILE
,他们直接指向一个外部创建的 .rc 或 .res 文件。通过设置其中的一个变量,指定的文件就可以被链接到 EXE 或 DLL。
注意:如果设置了 RC_FILE
或 RES_FILE
,qmake 对 .rc 文件的生成就失效了。这种情况下,qmake 不会对指定的 .rc 文件或 .res 或 .o 文件作进一步更改,有关 .rc 文件生成的变量不会有任何效果。
系统变量
QMAKE_TARGET_COMPANY
指定项目目标的公司名称
QMAKE_TARGET_DESCRIPTION
指定项目目标的描述信息
QMAKE_TARGET_COPYRIGHT
指定项目目标的版权信息
QMAKE_TARGET_PRODUCT
指定项目目标的产品名称
RC_CODEPAGE
指定应该被包含进一个 .rc 文件中的代码页
RC_LANG
指定应该被包含进一个 .rc 文件中的语言
注意: QMAKE_TARGET_COMPANY
、QMAKE_TARGET_DESCRIPTION
、QMAKE_TARGET_COPYRIGHT、QMAKE_TARGET_PRODUCT
、RC_CODEPAGE
、RC_LANG
均仅适用于 Windows, 而且只有在 VERSION
或 RC_ICONS
变量被设置,并且 RC_FILE
和 RES_FILE
变量没有被设置的情况下生效。
RC_ICONS
仅适用于 Windows,指定应该被包含进一个 .rc 文件中的图标,只有在 RC_FILE
和 RES_FILE
没有被设置的情况下生效。
VERSION
指定程序的版本号,需要将 TEMPLATE 指定为 app 或 lib。
在 Windows 中,如果没有设置变量 RC_FILE
和 RES_FILE
,将会自动生成一个 .rc 文件,生成的文件包含 FILEVERSION
和 PRODUCTVERSION
,由主版本、次版本、补丁版本和构建号填充,每个数字必须在 0 - 65535 范围内。
例如:
win32:VERSION = 1.2.3.4 # major.minor.patch.build
else:VERSION = 1.2.3 # major.minor.patch
windres
windres 可用于操纵 Windows 资源,windres 并不总是建成二进制实用程序的一部分,因为它只用于 Windows 目标。
在 windres 文档中,关于语言的描述如下:
–language val
Specify the default language to use when reading an rc file. val should be a hexadecimal language code. The low eight bits are the language, and the high eight bits are the sublanguage.
意思是:指定读取 rc 文件时使用的默认语言。val 应该是一个十六进制的语言代码,低 8 位是语言,高 8 位是子语言。
关于语言代码的描述可以参考:Language Identifier Constants and Strings
也就是说,如果要将程序的语言设置为“中文(简体)”,则只需要在 pro 中设置语言的“区域设置标识符”0x0004
即可:
RC_LANG = 0x0004
示例
如上所属,我们可以很轻易地将信息添加至 EXE 或 DLL 中:
只需要在 pro 中添加变量和对应的值:
# 版本信息
VERSION = 4.0.2.666
# 图标
RC_ICONS = Images/MyApp.ico
# 公司名称
QMAKE_TARGET_COMPANY = "Digia"
# 产品名称
QMAKE_TARGET_PRODUCT = "Qt Creator"
# 文件说明
QMAKE_TARGET_DESCRIPTION = "Qt Creator based on Qt 5.7.0 (MSVC 2013, 32 bit)"
# 版权信息
QMAKE_TARGET_COPYRIGHT = "Copyright 2008-2016 The Qt Company Ltd. All rights reserved."
# 中文(简体)
RC_LANG = 0x0004
执行 qmake -> build,再次打开 .rc 文件,对应的元素信息已经被填充进去了。
建议:如果需要反复修改变量值,最好的方式:clear -> qmake -> build。切记不要忘记 qmake,因为只有执行了 qmake,才会重新生成 .rc 文件,将新修改的值重新写入。
更多参考
http://blog.csdn.net/u011012932/article/details/52702523#comments