交叉编译Go程序

你只需设置 GOOSGOARCH 两个环境变量就能生成所需平台的Go程序。

比如使用下面的代码测试:

1
2
3
4
5
6
7
8
package main

import "fmt"
import "runtime"

func main() {
fmt.Printf("OS: %s\nArchitecture: %s\n", runtime.GOOS, runtime.GOARCH)
}

编译它: $ GOOS=darwin GOARCH=386 go build test.go
就可以生成运行在OS X上的程序。

可用的OS和ARCH的值如下:

$GOOS$GOARCH
darwin386
darwinamd64
darwinarm
darwinarm64
dragonflyamd64
freebsd386
freebsdamd64
freebsdarm
linux386
linuxamd64
linuxarm
linuxarm64
linuxppc64
linuxppc64le
netbsd386
netbsdamd64
netbsdarm
openbsd386
openbsdamd64
openbsdarm
plan9386
plan9amd64
solarisamd64
windows386
windowsamd64

不同的操作系统下的库可能有不同的实现, 比如syscall库。go build没有内置的#define或者预处理器之类的处理平台相关的代码取舍, 而是采用tag和文件后缀的方式实现。
tag方式
tag遵循一下规则

  1. a build tag is evaluated as the OR of space-separated options
  2. each option evaluates as the AND of its comma-separated terms
  3. each term is an alphanumeric word or, preceded by !, its negation

在文件的头部增加tag:

1
// +build darwin freebsd netbsd openbsd

可以有多个tag,之间是AND的关系

1
2
// +build linux darwin
// +build 386

注意tag和package中间需要有空行分隔,下面的例子是不对的:

1
2
// +build !linux
package mypkg // wrong

文件后缀方式
_$GOOS.go为后缀的文件只在此平台上编译,其它平台上编译时就当此文件不存在。完整的后缀如:

1
_$GOOS_$GOARCH.go

如syscall_linux_amd64.go,syscall_windows_386.go,syscall_windows.go等。

请博主喝杯咖啡~
0%