Golang: Build

20th August 2020 at 2:19pm
Golang

go build 命令,会把当前目录树下的 go 文件编译出来,放在 $GOPATH/pkg 的相应目录中。go 编译出来的可执行文件比较大,因为会包含 go runtime 在其中。

go 的内置库,有一些提供了带 cgo 和不带 cgo 两个版本,参考 Golang: Runtime,有详细描述。Go 默认使用 cgo 版本,如果想不用,可以置环境变量 CGO_ENABLED=0

CGO_ENABLED=0 go build

但是并不是 CGO_ENABLED=0 之后,就一定能编出完全无其他依赖的静态二进制文件。比如有些代码依赖 libpcap,而 libpcap 又没有纯 Go 的实现,那么 CGO_ENABLED=0 是会编译失败的,默认编出来的程序会依赖 libpcap 的动态库。大概率很难编出纯静态的。

跨平台编译(Cross Compiling)

Go 是可以跨平台编译的。比如在 Linux 上编 Windows 上的 binary:

GOOS=windows GOARCH=386 go build -o hello.exe hello.go

这个命令可以看 Go 支持的平台:

$ go tool dist list
android/386
android/amd64
...

mitchellh/gox 是个简单的工具,类似 go build,但是可以一次性把各平台的 binary 都编译出来。

参考