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

xiaojun1195 · · 4912 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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

本文出处https://blog.csdn.net/qq_32394351/article/details/93468119

核心命令示例:    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

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

 

 然后打开软件看看:

不尽人意的地方还是有两处,一,我这个是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:

接着upx再来一下:

 

双击运行一下这个exe:

 

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


upX一下:

 

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

 

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

 

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

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

运行图示:

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

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

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

 

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

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

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

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

 

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

 

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

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

 

 界面变成了这样:

接着选择添加图标资源:

 

 

 

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

 

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

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

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

 

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

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

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

很嗨皮哦! 

有用记得点个关注,谢谢 

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

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

项目地址: https://github.com/ying32/govcl
————————————————
版权声明:本文为CSDN博主「晚风拂柳颜」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_32394351/article/details/93468119


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

4912 次点击  ∙  1 赞  
加入收藏 微博
3 回复  |  直到 2021-10-14 18:56:09
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传