如何在Mac上为Ubuntu交叉编译Go程序?

2 macos cross-compiling go

vagrant@precise64:/vagrant$ sudo ./myprogram 
./myprogram: 1: ./myprogram: Syntax error: "(" unexpected
Run Code Online (Sandbox Code Playgroud)

我发现当我不从同一个操作系统生成二进制文件时会发生这种情况.我go build使用Mac OS,但我需要从使用Ubuntu Linux的Vagrant运行这个二进制文件.我应该使用什么命令而不是go buildMac,以便我可以在Vagrant环境中运行二进制程序?

Von*_*onC 8

注意:随着即将推出的Go 1.5(2015年第3季度),这将更容易.

请参阅" 在Go 1.5中交叉编译变得更好 "
(仍然来自Dave Cheney)

要成功进行交叉编译,您需要

  • 目标平台的编译器,如果它们与您的主机平台不同,即您使用darwin/amd64(6g)并且您想要编译linux/arm(5g).
  • 目标平台的标准库,其中包含在构建Go分发时生成的一些文件.

随着计划将Go编译器转换为Go在1.5版本中取得成果,第一个问题现在已经解决.

package main

import "fmt"
import "runtime"

func main() {
        fmt.Printf("Hello %s/%s\n", runtime.GOOS, runtime.GOARCH)
}
Run Code Online (Sandbox Code Playgroud)

为达尔文建造/ 386

% env GOOS=darwin GOARCH=386 go build hello.go
# scp to darwin host
$ ./hello
Hello darwin/386
Run Code Online (Sandbox Code Playgroud)

或者为linux/arm构建

% env GOOS=linux GOARCH=arm GOARM=7 go build hello.go
# scp to linux host
$ ./hello
Hello linux/arm
Run Code Online (Sandbox Code Playgroud)