如何在Linux环境下为Windows .exe文件设置图标(适用于GitHub Actions中Godot项目导出场景)
如何在Linux环境下为Windows .exe文件设置图标(适用于GitHub Actions中Godot项目导出场景)
我完全懂你的痛点——就为了给Godot导出的Windows exe加个图标,还要在GitHub Actions的Linux runner上折腾Wine,实在是小题大做,太麻烦了!好在现在有几个原生Linux工具能轻松搞定这个事儿,完全不用碰Wine,下面给你一步步讲清楚:
推荐方案1:用icoutils + binutils(系统原生包,最省心)
这是Linux生态里比较成熟的组合,两个工具都是发行版官方仓库里的,在GitHub Actions的Ubuntu runner上一键就能装,不用额外折腾预编译二进制或者外部依赖。
具体步骤:
- 安装依赖工具
在Ubuntu/Debian系的runner上,直接用apt安装:sudo apt-get update && sudo apt-get install -y icoutils binutils - 准备Windows兼容的ICO图标文件
Windows的exe图标最好是包含多分辨率的ICO格式(比如16x16、32x32、64x64、256x256),这样在不同场景下(任务栏、文件管理器、快捷方式)都能显示清晰。如果你的图标还是PNG格式,用icotool一键转换:
(把上面的PNG路径换成你实际的图标文件就行,想加更多分辨率也可以继续追加)icotool -c assets/icon-16.png assets/icon-32.png assets/icon-64.png assets/icon-256.png -o build/app-icon.ico - 把图标嵌入Godot导出的exe
用binutils里的objcopy直接修改exe的资源段,替换掉默认的Godot图标:
(objcopy --update-section .rsrc=build/app-icon.ico build/your-game.exebuild/your-game.exe是Godot导出的exe路径,换成你自己的项目输出路径就行)
推荐方案2:用Go语言的rsrc工具(轻量跨平台)
如果你不想装系统级的工具包,或者需要更灵活的资源处理,可以用rsrc——这是个Go写的跨平台工具,原生支持Linux,没有多余的依赖。
具体步骤:
- 在Actions里安装Go并编译rsrc
先安装Go环境,再通过Go模块编译rsrc:sudo apt-get install -y golang-go go install github.com/akavel/rsrc@latest - 生成Windows资源文件
用rsrc把ICO图标转换成Windows可识别的资源格式:$HOME/go/bin/rsrc -ico build/app-icon.ico -o app-res.syso - 嵌入exe资源段
还是用objcopy把生成的资源文件插入到exe中:objcopy --add-section .rsrc=app-res.syso build/your-game.exe
GitHub Actions完整Workflow片段
把上面的图标处理步骤整合到你的Godot导出流程里,大概是这样的:
jobs: build-windows: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 # 这里是你现有的Godot安装和项目导出步骤 - name: Set up Godot run: | # 替换成你实际的Godot安装逻辑,比如用官方Action或直接下载 - name: Export Windows build run: godot --export "Windows Desktop" build/your-game.exe # 新增的图标处理步骤(用方案1的工具) - name: Install icon handling tools run: sudo apt-get update && sudo apt-get install -y icoutils binutils - name: Convert PNG to multi-resolution ICO run: icotool -c assets/icon-16.png assets/icon-256.png -o build/app-icon.ico - name: Embed icon into EXE run: objcopy --update-section .rsrc=build/app-icon.ico build/your-game.exe
实用小提示
- 一定要用包含多分辨率的ICO文件,不然Windows在不同DPI的显示器上显示图标时可能会模糊
- 如果你的Godot导出的exe已经有默认图标,
objcopy --update-section会直接覆盖原来的资源,不需要额外删除旧图标 - 这两个方案都是纯Linux原生操作,比装Wine快得多,完全适配GitHub Actions的CI/CD场景,不会浪费 runner 的时间
备注:内容来源于stack exchange,提问作者Cassiterite




