Golang 支持在一个平台下生成另一个平台可执行程序的交叉编译功能。
环境变量
- CGO_ENABLED
- 交叉编译是不支持CGO的,也就是说如果你的代码中存在C代码,是编译不了的,比如说你的程序中使用了sqlite数据库,在编译go-sqlite驱动时按照上面的做法是编译不通过的。
- 需要CGO支持的,要将CGO_ENABLED的0改为1,也就是
CGO_ENABLED=1
,此外还需要设置编译器,具体百度
- GOOS
目标可执行程序运行操作系统,支持 darwin,freebsd,linux,windows - GOARCH
目标可执行程序操作系统构架,包括 386,amd64,arm - -ldflags
- -s:去掉符号表,panic时候的stack trace就没有任何文件名/行号信息了,这个等价于普通C/C++程序被strip的效果,
- -w:去掉DWARF调试信息,得到的程序就不能用gdb调试了。
编译
直接cd到项目目录下直接执行以下命令:
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
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
Windows下编译Mac, Linux平台的64位可执行程序
SET CGO_ENABLED=0 SET GOOS=darwin3 SET GOARCH=amd64 go build test.go
SET CGO_ENABLED=0 SET GOOS=linux SET GOARCH=amd64 go build test.go
Golang version 1.5 以前版本在首次交叉编译时还需要配置交叉编译环境:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 ./make.bash
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 ./make.bash
编译到 windowns
缩小体积
- 当我们编译go程序的时候发现编译后的go程序比起编译后的c程序大多了(同样简单的heello word),这里给出一个解决方案。
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "-s -w" main.go
- 加壳压缩 UPX(github)
UPX achieves an excellent compression ratio and offers very fast decompression.
简而言之,upx就是对可执行文件进行压缩,然后可以已极快的速度解压并运行
mac:
brew install upx
upx 可执行文件<br />
win:upx.exe -9 -k "test.exe"
关于golang程序编译后体积大原理及尝试解决见:
Go的交叉编译与减小体积的若干尝试
golang语言编译的二进制可执行文件为什么比 C 语言大