交叉编译Go

时间:2014-12-10 23:12:52

标签: linux macos ubuntu go cross-compiling

我正在尝试在我的macbook上交叉编译Go for ubuntu linux x86_64。我遵循了here概述的说明,但当我运行go-linux-amd64 build时,我收到以下消息go build runtime: linux/amd64 must be bootstrapped using make.bash。任何有关这方面的帮助将不胜感激。

3 个答案:

答案 0 :(得分:29)

它说你需要做的是重建linux-amd64的库和运行时。你可以这样做:

  1. 找到Go安装的根目录(如果你不知道它在哪里,运行which go可能会有所帮助 - 二进制文件经常与其他来源一起安装)。
  2. cd进入src目录
  3. 如果GOOS=linux GOARCH=amd64 ./make.bash --no-clean不可执行,请运行GOOS=linux GOARCH=amd64 bash make.bash --no-clean(或make.bash。这将使用指定的操作系统和体系结构重建库和运行时。
  4. 完成此操作后,您可以使用GOOS=linux GOARCH=amd64 go build为此体系结构构建go包或二进制文件。您可以按照其他体系结构和操作系统的相同说明进行操作。

    编辑(08/13/15):

    从Go 1.5开始,交叉编译很多更容易。由于运行时是用Go编写的,因此无需进行任何设置即可进行交叉编译。您现在可以从vanilla Go安装中运行GOOS=<os> GOARCH=<arch> go build,它将起作用。

    但是,有一个例外。如果您正在使用cgo,您仍需要提前设置内容。并且您需要通过将CGO_ENABLED环境变量设置为1来通知工具您要启用cgo交叉编译。所以,确切地说:

    1. cd进入Go安装的src目录(请参阅上面的说明)。
    2. 运行CGO_ENABLED=1 GOOS=<os> GOARCH=<arch> ./make.bash --no-clean
    3. 运行CGO_ENABLED=1 go build以构建您的项目。即使在编译时也必须指定CGO_ENABLED=1

答案 1 :(得分:1)

按照上面的回答https://stackoverflow.com/a/27413148/3675575,我需要设置GOROOT_BOOTSTRAP来重新编译我的GO源代码树:

GOROOT_BOOTSTRAP=/usr/lib/golang/ CGO_ENABLED=1 GOOS=linux GOARCH=386 ./make.bash --no-clean

(我正在使用Fedora 23,因此GOROOT_BOOTSTRAP在您的操作系统中可能会有所不同)

答案 2 :(得分:-1)

您必须cd %goroot%/src/,find make.bash

然后执行./make.bash

执行你的命令。试试吧!