微软专家 发表于 2026-6-5 19:00:00

使用go-winres为Go编译的Windows exe添加图标和属性信息

在使用Go语言开发Windows应用程序时,编译得到的exe文件天然不依赖动态链接库和运行环境,但默认也不含图标、文件版本、公司名称等属性信息。对于需要分发给用户的桌面工具或系统服务,带上正确的图标和元数据不仅能提升专业度,还能避免被误识别为可疑文件。本文介绍如何通过go-winres这一命令行工具,为Go构建的exe添加自定义图标和标准资源信息。

安装go-winres
首先确保已安装Go开发环境。在终端执行以下命令即可将go-winres安装到系统PATH中:

go install github.com/tc-hib/go-winres@latest

安装完成后,在命令行中直接使用go-winres命令。

初始化配置模板
在Go项目的根目录下执行:

go-winres init

该命令会在当前目录生成一个winres文件夹,其中包含winres.json配置文件以及两个示例PNG图标文件(icon.png和icon16.png)。winres.json是核心配置,用于定义图标、应用程序清单和版本元数据。

配置图标
使用文本编辑器打开winres.json。找到RT_GROUP_ICON节点,其结构如下:

"RT_GROUP_ICON": {
"APP": {
"0000": [
"icon.png",
"icon16.png"
]
}
}

APP代表图标组名称,0000代表语言(通常无需修改)。数组内列出需要嵌入的图标文件,支持多个分辨率,最终exe会根据系统需要自动选择合适的尺寸。
将自定义的图标文件(PNG格式,尺寸不超过256x256)放入winres文件夹,然后修改配置,例如只保留一个图标文件:

"RT_GROUP_ICON": {
"APP": {
"0000": [
"my-icon.png"
]
}
}

注意:图标文件必须与winres.json位于同一目录(即winres文件夹内)。

配置应用程序清单
RT_MANIFEST节点用于声明程序所需的最低操作系统版本、执行权限、DPI感知等属性。示例如下:

"RT_MANIFEST": {
"#1": {
"2052": {
"description": "我的Go示例程序",
"minimum-os": "win7",
"execution-level": "highest",
"dpi-awareness": "system",
"ui-access": false,
"auto-elevate": false,
"disable-theming": false,
"disable-window-filtering": false,
"high-resolution-scrolling-aware": false,
"ultra-high-resolution-scrolling-aware": false,
"long-path-aware": false,
"printer-driver-isolation": false,
"gdi-scaling": false,
"segment-heap": false,
"use-common-controls-v6": false
}
}
}

常用字段说明:
- description:文件描述信息。
- minimum-os:最低操作系统版本,可选值包括"vista"、"win7"、"win8"、"win8.1"、"win10"。
- execution-level:请求的权限级别,可选"as invoker"(无特殊权限)、"highest"(当前用户可用最高权限)、"administrator"(强制以管理员身份运行)。
- dpi-awareness:DPI感知级别,建议设为"system"或"per-monitor"。
注意:identity字段(名称和版本)对于普通应用程序可以留空或删除。

配置版本元数据
RT_VERSION节点用于设置文件版本、产品版本、公司名称、版权等属性。结构如下:

"RT_VERSION": {
"#1": {
"0000": {
"fixed": {
"file_version": "1.0.0.0"
},
"info": {
"2052": {
"CompanyName": "公司名称",
"FileDescription": "我的Golang示例程序",
"LegalCopyright": "© 版权",
"OriginalFilename": "demo.exe",
"ProductName": "Go示例",
"ProductVersion": "1.0.0.0"
}
}
}
}
}

- fixed.file_version / product_version:按x.y.z.w格式填写。
- info内以语言代码为键(如0409为英语,2052为简体中文),可配置多语言,Windows会按系统语言显示对应信息。
为简化配置,原文提供了一个精简的模板,读者可根据自身需求修改。

编译资源文件
在winres文件夹所在目录(即项目根目录)下执行:

go-winres make

该命令会读取winres/winres.json,生成两个syso文件(例如resource_windows_amd64.syso和resource_windows_386.syso)。这些syso文件即为编译后的资源对象,后续go build会自动链接。
如果配置文件不在默认位置,可通过--in参数指定:

go-winres make --in "../res/winres.json"

使用--out可指定输出路径。

编译Go程序
确保资源文件(syso)、go.mod以及Go源代码处于同一目录下。然后正常执行go build命令:

go build -ldflags "-w -s"

其中-ldflags "-w -s"为可选参数,用于去除调试信息和符号表以减少exe体积。生成的可执行文件将包含先前配置的图标、版本信息、描述等属性。

注意事项
- syso文件的后缀名必须保留类似_windows_amd64.syso的形式,不能随意更改,否则go build无法根据目标架构自动匹配。
- 编译时请注意目标架构:go build默认使用当前系统架构,如需交叉编译32位exe,需设置环境变量GOARCH=386,go build会自动选择对应的_windows_386.syso文件。
- 如果项目中已存在go.mod,syso文件必须与go.mod同级;如果没有go.mod,则需与主入口文件(如main.go)同级。
通过以上步骤,任何用Go编写的Windows命令行工具或后台服务都能拥有标准的Windows资源信息,从而更好地融入Windows生态。

热心网友5 发表于 2026-6-5 19:05:00

Re: 使用go-winres为Go编译的Windows exe添加图标和属性信息

感谢分享!正好最近在给一个Go写的命令行小工具打包,默认没有图标看着确实有点简陋。教程很清晰,特别是清单和版本信息的配置部分,之前一直搞不清DPI感知怎么设,这下明白了。想请教一下,如果图标文件不是PNG而是ICO格式,go-winres是否支持直接使用?还是需要先转成PNG?

热心网友1 发表于 2026-6-22 21:20:04

Re: 使用go-winres为Go编译的Windows exe添加图标和属性信息

非常实用的教程!我一直想给Go写的Windows exe加上图标和版本信息,但之前不知道怎么弄。这个步骤清晰明了,从安装到配置再到编译都讲得很详细,感谢分享!

热心网友6 发表于 2026-6-22 21:30:04

Re: 使用go-winres为Go编译的Windows exe添加图标和属性信息

好详细的教程,正好最近在给Go写的工具加图标,谢谢分享!请问如果只有一个PNG图片,但想生成多尺寸图标,是不是得先手动制作不同尺寸的PNG再列进去?
页: [1]
查看完整版本: 使用go-winres为Go编译的Windows exe添加图标和属性信息