前言

go build默认产生的可执行文件没有图标icon,有时候挺丑的,想增加icon怎么办呢

1、方法1 - windres命令

怎么安装和使用minGW参考前一篇文章Win10下新的gcc工具

1.1、创建rc文件

以test.go举例, 假设打包文件名test.exe, ico文件名test.ico
rc文件命名test.exe.rc

文件中输入

1
IDI_ICON1 ICON "test.ico"

1.2、执行windres命令创建syso文件

1
windres -o test.exe.syso test.exe.rc

1.3、执行go build

1
go build

2、方法2 - rsrc命令

需要先下载rsrc命令

1
go get github.com/akavel/rsrc

2.1、创建manifest文件

仍然以test.go举例,假设打包文件名test.exe,ico文件名test.ico
manifest文件名test.exe.manifest

文件中输入

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity
    version="1.0.0.0"
    processorArchitecture="x86"
    name="controls"
    type="win32">
    </assemblyIdentity>

    <dependency>
        <dependentAssembly>
            <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="*"
            publicKeyToken="6595b64144ccf1df"
            language="*">
            </assemblyIdentity>
        </dependentAssembly>
    </dependency>
</assembly>

2.2、执行rsrc命令创建syso

1
rsrc -manifest test.exe.manifest -ico test.ico -o test.exe.syso

2.3、执行go build

1
go build

注:

测试发现,有的blog写的打包命令建议带参数:

1
go build -ldflags="-H windowsgui -w -s"

应该只有gui的程序才需要带,本文举例是非gui界面的,因此带了反而会出现无法正确运行。 对比带了该参数比直接的go build打包出来的文件大小不一致,偏小很多,可能非gui的命令行程序不适合带这个参数。 比如用walk的gui go项目带了没问题。
验证通过2、3步骤做了ico处理的,建议通过go build打包。

3、可以写打包脚本

创建build.bat

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
@echo off
Title build...                                              
Color 0A

REM 声明采用UTF-8编码
chcp 65001

:menu
echo =============================================
echo.
echo No.1-选择用minGW工具打包
echo.
echo No.2-选择用rsrc工具打包
echo.
echo =============================================

set /p user_input=请输入你的选择:

if %user_input% equ 1 goto 1

if %user_input% equ 2 goto 2

if %user_input% == '3' exit

pause

:: 1. minGW
:1
echo "请先安装好dev C++工具minGW"

echo windresing...
windres -o md5.exe.syso md5.exe.rc

echo building...
go build
goto end

:: 2.rsrc
:2
echo "需要先安装工具命令rsrc,命令:go get github.com/akavel/rsrc" 

echo rsrc manifesting...
rsrc -manifest md5.exe.manifest -o md5.exe.syso -ico md5.ico

echo building...
go build
goto end

:end
echo complete