golang 编译压缩体积

为了让体积更小一点,也许可以尝试以下方法
第一步 : 编译 go build 时加上 -ldflags “-s -w”
其中 -ldflags 里的 -s 去掉符号信息, -w 去掉DWARF调试信息,得到的程序就不能用gdb调试了



不过编译之后好像还是挺大的哦



这时候可以启用另一神器 upx 加壳压缩
upx三个平台都能下载安装
支持的参数可以查阅手册
例子 upx -9 xxx
压缩之后发现了什么,是不是小了很多,如果对代码体积有要求, 这个方法应该是个不错的解决方案

可以用brew快速安装upx
brew install upx
upx 可执行文件



https://github.com/golang/go/issues/6853
go build -ldflags “-s -w” ‘-s’ 相当于strip掉符号表, 但是以后就没办法在gdb里查看行号和文件了。 ‘-w’ flag to the linker to omit the debug information 告知连接器放弃所有debug信息



go build -ldflags “-s -w”
相关解释:
-s去掉符号表,panic时候的stack trace就没有任何文件名/行号信息了,这个等价于普通C/C++程序被strip的效果,



-w去掉DWARF调试信息,得到的程序就不能用gdb调试了。 -s和-w也可以分开使用.



通过去除部分连接和调试,build部分参数查看结果。
-a 强制编译所有依赖包。
-s 去掉符号信息
-w 去掉DWARF调试信息,得到的程序就不能用gdb调试了
不建议s和w同时使用。



Golang 支持在一个平台下生成另一个平台可执行程序的交叉编译功能。



1、Mac下编译Linux, Windows平台的64位可执行程序:



$ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build test.go



$ CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build test.go



2、Linux下编译Mac, Windows平台的64位可执行程序:



$ CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build test.go



$ CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build test.go



3、Windows下编译Mac, Linux平台的64位可执行程序:



$ SET CGO_ENABLED=0SET GOOS=darwin3 SET GOARCH=amd64 go build test.go



$ SET CGO_ENABLED=0 SET GOOS=linux SET GOARCH=amd64 go build test.go



注:如果编译web等工程项目,直接cd到工程目录下直接执行以上命令



GOOS:目标可执行程序运行操作系统,支持 darwin,freebsd,linux,windows



GOARCH:目标可执行程序操作系统构架,包括 386,amd64,arm



Golang version 1.5以前版本在首次交叉编译时还需要配置交叉编译环境:



CGO_ENABLED=0 GOOS=linux GOARCH=amd64 ./make.bash



CGO_ENABLED=0 GOOS=windows GOARCH=amd64 ./make.bash



-asmflags
此标记可以后跟另外一些标记,如-D、-I、-S等。这些后跟的标记用于控制Go语言编译器编译汇编语言文件时的行为。



-buildmode
此标记用于指定编译模式,使用方式如-buildmode=default(这等同于默认情况下的设置)。此标记支持的编译模式目前有6种。借此,我们可以控制编译器在编译完成后生成静态链接库(即.a文件,也就是我们之前说的归档文件)、动态链接库(即.so文件)或/和可执行文件(在Windows下是.exe文件)。



-compiler
此标记用于指定当前使用的编译器的名称。其值可以为gc或gccgo。其中,gc编译器即为Go语言自带的编辑器,而gccgo编译器则为GCC提供的Go语言编译器。而GCC则是GNU项目出品的编译器套件。GNU是一个众所周知的自由软件项目。在开源软件界不应该有人不知道它。好吧,如果你确实不知道它,赶紧去google吧。



-gccgoflags
此标记用于指定需要传递给gccgo编译器或链接器的标记的列表。



-gcflags
此标记用于指定需要传递给go tool compile命令的标记的列表。



-installsuffix
为了使当前的输出目录与默认的编译输出目录分离,可以使用这个标记。此标记的值会作为结果文件的父目录名称的后缀。其实,如果使用了-race标记,这个标记会被自动追加且其值会为race。如果我们同时使用了-race标记和-installsuffix,那么在-installsuffix标记的值的后面会再被追加_race,并以此来作为实际使用的后缀。



-ldflags
此标记用于指定需要传递给go tool link命令的标记的列表。



-linkshared
此标记用于与-buildmode=shared一同使用。后者会使作为编译目标的非main代码包都被合并到一个动态链接库文件中,而前者则会在此之上进行链接操作。



-pkgdir
使用此标记可以指定一个目录。编译器会只从该目录中加载代码包的归档文件,并会把编译可能会生成的代码包归档文件放置在该目录下。



-tags
此标记用于指定在实际编译期间需要受理的编译标签(也可被称为编译约束)的列表。这些编译标签一般会作为源码文件开始处的注释的一部分,例如,在$GOROOT/src/os/file_posix.go开始处的注释为:



// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.



// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris windows
最后一行注释即包含了与编译标签有关的内容。大家可以查看代码包go/build的文档已获得更多的关于编译标签的信息。



-toolexec
此标记可以让我们去自定义在编译期间使用一些Go语言自带工具(如vet、asm等)的方式。


Category golang