6

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

 2 years ago
source link: https://studygolang.com/articles/35182
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

xiaojun1195 · 1天之前 · 210 次点击 · 预计阅读时间 4 分钟 · 大约8小时之前 开始浏览    

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


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

280

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK