交叉编译是用来在一个平台上生成另一个平台的可执行程序 。Go 命令集是原生支持交叉编译的。
Mac下编译:Linux 或 Windows 的可执行程序
# linux 可执行程序
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
# Windows可执行程序
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go
Linux下编译:Mac 或 Windows的可执行程序
# Mac可执行程序
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build main.go
# Windows可执行程序
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go
Windows下编译:Mac 或 Linux的可执行程序
需要写一个批处理程序,在里面去设置,因为windows 下的 terminal 不支持shell , 这跟 Mac 和 Linux下的有点不同
# Mac可执行程序
SET CGO_ENABLED=0
SET GOOS=darwin
SET GOARCH=amd64
go build main.go
# Linux可执行程序
SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=amd64
go build main.go
参数说明
CGO_ENABLED
- 当CGO_ENABLED=1, 进行编译时, 会将文件中引用libc的库(比如常用的net包),以动态链接的方式生成目标文件。
- 当CGO_ENABLED=0, 进行编译时, 则会把在目标文件中未定义的符号(外部函数)一起链接到可执行文件中。
- go 编译时,环境变量CGO_ENABLED的作用
GOOS
- 目标平台 支持 darwin,freebsd,linux,windows
- mac 对应 darwin
- linux 对应 linux
- windows 对应 windows
GOARCH
- 目标平台的体系架构【386,amd64, arm】, 目前市面上的个人电脑一般都是amd64架构的
- 386 也称 x86 对应 32位操作系统
- amd64 也称 x64 对应 64位操作系统
- arm 这种架构一般用于嵌入式开发。比如 Android , IOS , Win mobile , TIZEN 等