MinGW编译Windows程序添加文件属性中的版本信息
Windows应用程序或DLL文件,通过Windows资源管理器查看文件属性,其中可以看到文件说明、产品名称与版本、版权等信息,Microsoft官方称之为VERSIONINFO(版本信息资源)。本文讲述在使用MinGW编译Windows程序时如何添加此版本信息资源。
Windows应用程序开发中,版本信息定义于VersionInfo.rc文件中。因此我们首先需要一个文件模板:
以下两个分别来源于微软官方和网络:
微软:
#define VER_FILEVERSION 3,10,349,0
#define VER_FILEVERSION_STR "3.10.349.0\0"
#define VER_PRODUCTVERSION 3,10,0,0
#define VER_PRODUCTVERSION_STR "3.10\0"
#ifndef DEBUG
#define VER_DEBUG 0
#else
#define VER_DEBUG VS_FF_DEBUG
#endif
VS_VERSION_INFO VERSIONINFO
FILEVERSION VER_FILEVERSION
PRODUCTVERSION VER_PRODUCTVERSION
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEFLAGS (VER_PRIVATEBUILD|VER_PRERELEASE|VER_DEBUG)
FILEOS VOS__WINDOWS32
FILETYPE VFT_DLL
FILESUBTYPE VFT2_UNKNOWN
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904E4"
BEGIN
VALUE "CompanyName", VER_COMPANYNAME_STR
VALUE "FileDescription", VER_FILEDESCRIPTION_STR
VALUE "FileVersion", VER_FILEVERSION_STR
VALUE "InternalName", VER_INTERNALNAME_STR
VALUE "LegalCopyright", VER_LEGALCOPYRIGHT_STR
VALUE "LegalTrademarks1", VER_LEGALTRADEMARKS1_STR
VALUE "LegalTrademarks2", VER_LEGALTRADEMARKS2_STR
VALUE "OriginalFilename", VER_ORIGINALFILENAME_STR
VALUE "ProductName", VER_PRODUCTNAME_STR
VALUE "ProductVersion", VER_PRODUCTVERSION_STR
END
END
BLOCK "VarFileInfo"
BEGIN
/* The following line should only be modified for localized versions. */
/* It consists of any number of WORD,WORD pairs, with each pair */
/* describing a language,codepage combination supported by the file. */
/* */
/* For example, a file might have values "0x409,1252" indicating that it */
/* supports English language (0x409) in the Windows ANSI codepage (1252). */
VALUE "Translation", 0x409, 1252
END
END
第二个模板:
1 VERSIONINFO
FILEVERSION ${PROJECT_VERSION_MAJOR}, ${PROJECT_VERSION_MINOR}, ${PROJECT_VERSION_PATCH}
PRODUCTVERSION ${PROJECT_VERSION_MAJOR}, ${PROJECT_VERSION_MINOR}, ${PROJECT_VERSION_PATCH}
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x4L
FILETYPE 0x0L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0"
BEGIN
VALUE "FileDescription", "MyLibrary Binary"
VALUE "FileVersion", "${PROJECT_VERSION_MAJOR}, ${PROJECT_VERSION_MINOR}, ${PROJECT_VERSION_PATCH}"
VALUE "InternalName", "MyLibrary"
VALUE "LegalCopyright", "Copyright (C) 2019"
VALUE "OriginalFilename", ""
VALUE "ProductName", "MyLibrary"
VALUE "ProductVersion", "${PROJECT_VERSION_MAJOR}, ${PROJECT_VERSION_MINOR}, ${PROJECT_VERSION_PATCH}"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END
按照以上两个模板生成的exe文件,语言会显示英语,如果需要修改为中文,则需要对以下两个地方进行修改:
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "080404b0"
. . .
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x804, 1200
可见前面的
0804是语言代码,后面是字符集标识,Translation部分的1200,其十六进制就是上面StringFileInfo的04b0,上下两处的值要对应,否则编译出的exe文件,版本信息会显示错误)
VersionInfo.rc文件如果包含中文,则需要使用GB2312编码保存。若使用UTF-8,则中文会乱码。
按照模板修改得到资源文件后,需要首先编译资源文件为.o文件。MinGW存在一个专门用于编译资源文件的windres程序,使用以下命令将其编译为VersionInfo.o。
windres VersionInfo.rc -O coff -o VersionInfo.o
然后通过在GCC编译程序命令中添加VersionInfo文件进行目标程序编译:
gcc -o MyAPP.exe MyAPP.c VersionInfo.o
参考资料:
VERSIONINFO 资源 - Win32 apps | Microsoft Learn
https://learn.microsoft.com/zh-cn/windows/win32/menurc/versioninfo-resource
VarFileInfo BLOCK 语句 - Win32 apps | Microsoft Learn
https://learn.microsoft.com/zh-cn/windows/win32/menurc/varfileinfo-block
StringFileInfo BLOCK 语句 - Win32 apps | Microsoft Learn
https://learn.microsoft.com/zh-cn/windows/win32/menurc/stringfileinfo-block
CMake为DLL添加版本信息 - 知乎
https://zhuanlan.zhihu.com/p/97512450