自从接触 Golang 以来,一直对其编译出来的可执行文件有点看法,因为体积比较大。使用 go build av.go,编译简单的代码出来后就有近8M,当然,这是因为把 Go 的运行时环境也给打包进去了的原因,为了几k的源码实在是不划算,特别是在香蕉派/Firefly这些磁盘空间紧张的设备上面。
今天有搜索一下解决方法,Golang 的先行者给出的思路一共分为2步。
第一步,添加编译符号。
go build -ldflags “-s -w” av.go
-s 相当于strip掉符号表, 但是以后就没办法在gdb里查看行号和文件了。
-w 告知连接器放弃所有debug信息
衣服自己洗是使用 LiteIDE 来编写go代码的,按照下图添加即可,注意不要忘记添加引号,不然编译是无法通过的。
这样一来,编译后的文件就是5M多,看起来还是有点效果。
第二步,我们使用UPX来进一步压缩,其地址为 https://github.com/upx/upx,下载对应的版本即可。使用起来也很简单,默认即为压缩,输入upx av.exe 即可。
-d 解压缩
-l 查看压缩前后信息
现在再看,体积已经到1.7M左右了,效果很明显,就问你惊不惊喜,意不意外。
由于以前有木马病毒也使用UPX来加壳,导致现在杀毒软件对UPX不太友好。如果是部署在服务端或者Linux系统应该还好,特别是面向windows用户发布的,各位同学请慎重,可以考虑添加数字签名。至于如何使用数字签名,可以参考我的另外一个帖子。
对于产线的 Release 编译,使用自动化工具来做这个事情,应该都是小菜一碟了,就不提了。
在衣服自己洗以前的一篇文章中,Golang安装和配置 里写了使用go来编译go的步骤,最近发现官网上的新版本里已经提供windows, ubuntu 和 arm 的编译包了。这真心是个好消息,意味着我们安装更简单了。
对于windows而言,一路下一步,不需要多说什么了。
对于 ubuntu和 arm来说,解压缩到 /usr/share 目录下,然后添加环境变量即可。现在衣服自己洗偏好在 /etc/profile 里新增2行。
export PATH=$PATH:/usr/share/go/bin
export GOPATH=$HOME/go
这几天在用Go写个小工具,里面需要用到时间格式化。
一个方法是 time.Now().Format(“2006-01-02 15:04:05”),开始还好奇Go还可以这样直接识别出格式,不像C#那样 yyyy-MM-dd 这样的。后来发现原来这个时间是固定的,不能修改,否则格式化后的字符就不是期待的值。
真是个太奇葩的格式化字符常量了。
在说正事前,衣服自己洗需要说下Golang和Go的区分,事实上他们是同一个东西,仅仅是因为Go这个单词太常见了,在编程语言的描述中,为避免混乱,就改用Golang而已。这个问题我曾经也迷惑过。
Firefly 新版本的固件里,居然把板子上的灯默认给关闭了,也无法直接检索到了。这真是一个糟糕的设计。
为了打开Firefly上的灯,需要采用GPIO驱动,但是目前从上层软件搜索来看,论坛里一个可用的库却是采用Go来编写的。
那么问题就来了,首先我们需要安装Go的环境。
我们先来说windows上的安装,很简单,从官网上下载对应的windows版本,然后一路下一步安装即可。安装完成后,添加系统环境变量,GOPATH和GOROOT,这个变量在我自己理解来看,GOROOT是指Go的安装目录,默认的是C:\Go,然后GOPATH就真的是go想要搜索的其它资源的路径,支持多个路径。有点类似于C++里的工程include的味道。
对于linux系统,Google官方并没有给出编译好的版本,所以就需要我们下载源码自己安装了。衣服自己洗下载的是1.7.4的源码,放在/pi/go目录,进入src目录,运行 all.bash,显示出错,提示没有1.4的Tree,网上搜索了一下,发现go的新版本安装所需要的环境是需要先安装go1.4才可以的。
于是只好先下载go1.4的源码到/pi/go这个位置,再次运行 all.bash文件,由于是在香蕉派上运行,整个过程花了大概18分钟的样子,在安装后,还会自动运行测试程序,很遗憾,香蕉派上测试程序有的并没有测试通过,检查了/pi/go/bin目录下,已经生成了 go 和 fmt 文件,干脆拉倒。
修改 ~/.profile文件并添加2行代码如下:
export GOROOT=/pi/go
export PATH=$PATH:$GOROOT/bin
保存重启。然后再下载1.7.4版本的源码到原来的位置完成替换,然后再次运行/pi/go/src/all.bash,最好添加sudo。又是经过快20分钟的编译和安装。
写了个简单的hello world程序,go build hello.go,还是可以正确显示的。
至此,基本的运行环境就准备完毕了。