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位可执行程序:

    1. CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build test.go
    2. CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build test.go
  • Linux下编译Mac, Windows平台的64位可执行程序:

    1. CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build test.go
    2. CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build test.go
  • Windows下编译Mac, Linux平台的64位可执行程序

    1. SET CGO_ENABLED=0 SET GOOS=darwin3 SET GOARCH=amd64 go build test.go
    2. SET CGO_ENABLED=0 SET GOOS=linux SET GOARCH=amd64 go build test.go
  • Golang version 1.5 以前版本在首次交叉编译时还需要配置交叉编译环境:

    1. CGO_ENABLED=0 GOOS=linux GOARCH=amd64 ./make.bash
    2. CGO_ENABLED=0 GOOS=windows GOARCH=amd64 ./make.bash

编译到 windowns

缩小体积

  1. 当我们编译go程序的时候发现编译后的go程序比起编译后的c程序大多了(同样简单的heello word),这里给出一个解决方案。
  1. CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "-s -w" main.go
  1. 加壳压缩 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 语言大

感谢

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