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

时间:2014-04-29 23:49:06

标签: macos go cross-compiling

vagrant@precise64:/vagrant$ sudo ./myprogram 
./myprogram: 1: ./myprogram: Syntax error: "(" unexpected

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

2 个答案:

答案 0 :(得分:8)

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

参见" Cross compilation just got a whole lot better in Go 1.5"
(仍然来自Dave Cheney

  

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

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

计划在1.5版本中翻译Go compiler into Go即将实现,第一个问题现已解决。

package main

import "fmt"
import "runtime"

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

为darwin / 386构建

% env GOOS=darwin GOARCH=386 go build hello.go
# scp to darwin host
$ ./hello
Hello darwin/386
  

或者为linux / arm构建

% env GOOS=linux GOARCH=arm GOARM=7 go build hello.go
# scp to linux host
$ ./hello
Hello linux/arm

答案 1 :(得分:1)

您需要设置交叉编译环境(通过自己构建go编译器)。 Dave Cheney的博客有很好的指示:http://dave.cheney.net/2013/07/09/an-introduction-to-cross-compilation-with-go-1-1