golang如何编译一个最小的带GUI的标准exe

核心命令示例:    go build -ldflags="-s -w -H windowsgui" main.go

前言:

本人是学了python再过来玩golang的,在python中,我能实现的最小打包方式,就是基于tkinter写GUI界面,然后用pyintaller打包工具进行打包,打包完毕后用upx软件进行压缩,完了后exe可执行文件的体积大概就是8m左右

实践:

那么golang打包exe文件的体积一般是多少呢?

经过测试,用官方的打包方式 go build packagename 比如go build main.go,其中我main.go代码如下:

package main

import (
	"fyne.io/fyne/app"
	"fyne.io/fyne/widget"
)

func main() {
	app := app.New()

	w := app.NewWindow("Hello")
	w.SetContent(widget.NewVBox(
		widget.NewLabel("Hello Fyne!"),
		widget.NewButton("Quit", func() {
			app.Quit()
		}),
	))

	w.ShowAndRun()
}

代码参见:https://www.ctolib.com/fyne-io-fyne.html

打包后的应用体积为12MB

golang如何编译一个最小的带GUI的标准exe_第1张图片

然后开启Upx软件,给压缩一下,大概搞掉了三分之二的体积,得到一个4MB的exe可执行文件

golang如何编译一个最小的带GUI的标准exe_第2张图片

 

 然后打开软件看看:

golang如何编译一个最小的带GUI的标准exe_第3张图片

不尽人意的地方还是有两处,一,我这个是gui界面的,我不想要黑窗口啊。

二,我这个体积4MB还是有点大,能不能再小点。

so,再研究了一下官方的go build,发现有个-ldflags参数,可以实现这个效果:

怎么用呢?参见下面这行代码,在terminal或者cmd里面敲的

go build  -ldflags="-s -w -H windowsgui" main.go

那么具体里面这段 -ldflags="-s -w -H windowsgui" 是什么意思呢?

-ldflags=“参数”: 表示将引号里面的参数传给编译器
-s:去掉符号信息  (这样panic时,stack trace就没有任何文件名/行号信息了,这等价于普通C/C+=程序被strip的效果)
-w:去掉DWARF调试信息 (得到的程序就不能用gdb调试了)

-H windowsgui : 以windows gui形式打包,不带dos窗口。其中注意H是大写的

这样操作完毕后,回头看一下打包的exe:

golang如何编译一个最小的带GUI的标准exe_第4张图片

接着upx再来一下:

 golang如何编译一个最小的带GUI的标准exe_第5张图片

双击运行一下这个exe:

 golang如何编译一个最小的带GUI的标准exe_第6张图片

ok,正常运行并且没有dos窗口,然后体积还只能2423kb,比起最初的12271kb足足小了80%,因为12271*20%就是2423啊,哈哈我数学还行吧

如此说来是不是爽歪歪呢,那么我再看一下,还有没有可能精简大小呢

我们现在试试新建一个test.go,里面只写一个Hello world,然后打包带个dos再upx看看体积有多大

package main

import "fmt"

func main() {
	fmt.Println("hell world\n按下回车键退出...")
	fmt.Scanf("%s")
	fmt.Println("结束")
}

这里用到输入是为了阻塞线程,要不然打包后执行exe就会发下dos窗口一闪而过就没了。

现在打包一下看看,打包最小的带黑窗口的:

go build  -ldflags="-s -w " test.go

golang如何编译一个最小的带GUI的标准exe_第7张图片

upX一下:

 golang如何编译一个最小的带GUI的标准exe_第8张图片

好了,这是我打包过的最小的go程序了,竟然才507kb.双击运行一下看看是否正常

 golang如何编译一个最小的带GUI的标准exe_第9张图片

启动后在阻塞状态,等待用户输入,然后按个回车键就运行完毕结束程序了。 

 

所以总结了一下,引入的gui库,几行代码,2423kb的体积比这个500kb的原生dos程序到了1900多kb,说明这些多出来的体积都是gui库的,然后我们再想压缩这个体积,就只有一个方法了,那就是慢慢地去寻找有没有比这个库更小的,本次测试用的这个库是Fyne,因为我发现它在类似gui库中星数挺多,更新挺勤快的。后面有机会我还想测试一下qt之类的库。经过我的多次尝试,确实找到一个特别小的GUI库ndlabs,最后编译的exe经过upx后最小700kb,不过界面甚是原生。相关的用法我贴个地址吧:

https://www.jianshu.com/p/456f072f58af

运行图示:

golang如何编译一个最小的带GUI的标准exe_第10张图片

去这个地址找同类go gui的对比,然后自己挑一个来测试

https://www.ctolib.com/article/compares/44408

golang如何编译一个最小的带GUI的标准exe_第11张图片

好了,博客到此结束,不知道你是否学到了一点用GO做gui的想法呢。python都能做GUI,这里用Go来做,不乏是一个很好的尝试,因为打包的体积比python小啊,python最小8m,这个今天测试go的都才 2MB多点,而且python程序运行速度跟go比起来不是一个级别的,而且go语言打包的程序跟java一样,并不会被360等安全软件误报毒,是不是有点激动?

 

慢着,其实还没结束呢。因为我们现在搞出来的程序,没有图标,没有版权信息,那么该怎样加上呢?

其实很简单,编译好了,然后自己用外部工具给exe加上这些信息,然后再upx

这里推荐使用 ResourceHacker,自己百度一下下载就行了

golang如何编译一个最小的带GUI的标准exe_第12张图片

现在看使用,先安装完了,然后打开后的首界面里面点击打开文件:

 golang如何编译一个最小的带GUI的标准exe_第13张图片

 比如我现在打开了一个test.exe,然后该给他加版权信息了:

golang如何编译一个最小的带GUI的标准exe_第14张图片

 golang如何编译一个最小的带GUI的标准exe_第15张图片

下拉列表选择VERSION_INFO,然后点Add

golang如何编译一个最小的带GUI的标准exe_第16张图片

然后出来的这些东西自己看着编辑,也可以懒得改,不动它,然后先点绿色的运行按钮,完了在点保存

 golang如何编译一个最小的带GUI的标准exe_第17张图片

 界面变成了这样:

golang如何编译一个最小的带GUI的标准exe_第18张图片

接着选择添加图标资源:

golang如何编译一个最小的带GUI的标准exe_第19张图片

 golang如何编译一个最小的带GUI的标准exe_第20张图片

 golang如何编译一个最小的带GUI的标准exe_第21张图片

 golang如何编译一个最小的带GUI的标准exe_第22张图片

golang如何编译一个最小的带GUI的标准exe_第23张图片

一顿操作完毕,接着看我们那个exe程序:

golang如何编译一个最小的带GUI的标准exe_第24张图片

 golang如何编译一个最小的带GUI的标准exe_第25张图片

图标也加上了,版权信息也加上了。这回真没有了。对了。补充说明,一定要go build出来后就把这些东西加了再用upx压缩,千万别先upx了再加,因为那样的程序我亲测是不能运行的。然后理论上这个方法是能改python里面用pyinstaller打包的exe的哦,只不过pyinstaller自带这种带图标打包的操作。在此也不多提,具体可以看我博客里Python相关内容

最后再补充,就是推荐用goland这款ide来写go项目。原因在于我是python过来的,用习惯了pycharm这款ide,正好goland和pycharm的操作一模一样。

用goland把编译exe命令加入到外部工具:

golang如何编译一个最小的带GUI的标准exe_第26张图片

 golang如何编译一个最小的带GUI的标准exe_第27张图片

Arguments里面是   build -ldflags="-s -w -H windowsgui" $FileName$

然后在自己的main.go文件里面,点击goland菜单的外部工具:

golang如何编译一个最小的带GUI的标准exe_第28张图片

然后就发现main.exe已经和源码躺在一起了。后面你只需要加个图标,版权,然后手动upx一下就能发布了。

很嗨皮哦! 

有用记得点个关注,谢谢 

最后安利一波全球最强的golang GUI快速开发库,利用拖拽生成GUI界面并且控件众多,体验很好。

国人良心开发,总项目代码超过40w行,虽然星星少了点,但是真的好用。然后就是这么生成的exe文件经过最优压缩,轻轻松松变成2.5mb左右的单文件体积,非常好使。

项目地址: https://github.com/ying32/govcl

喜欢的记得点个星

你可能感兴趣的:(GO自学之路)