Go语言的交叉编译

12

我正在尝试在我的 MacBook 上为 Ubuntu Linux x86_64 进行 Go 交叉编译。我已经遵循了这里概述的说明,但是当我运行go-linux-amd64 build时,我收到以下消息:go build runtime: linux/amd64 必须使用 make.bash 进行引导。感谢任何对此的帮助。

3个回答

31
它说你需要为linux-amd64重新构建库和运行时。可以通过以下方式实现:
  1. 找到Go安装的根目录(如果您不知道在哪里,运行which go可能会有所帮助 - 二进制文件通常与其余源代码一起安装)。
  2. cd进入src目录
  3. 运行GOOS=linux GOARCH=amd64 ./make.bash --no-clean(如果make.bash不可执行,则运行GOOS=linux GOARCH=amd64 bash make.bash --no-clean)。这将使用指定的操作系统和架构重新构建库和运行时。
完成此操作后,您可以使用GOOS=linux GOARCH=amd64 go build为此架构构建go包或二进制文件。您可以按照相同的说明来操作其他架构和操作系统。
编辑(08/13/15):
从Go 1.5开始,交叉编译变得much更容易。由于运行时是用Go编写的,因此无需设置任何内容即可进行交叉编译。现在,您只需从原始的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
  • 运行CGO_ENABLED=1 go build来构建你的项目。即使在编译时,你也需要明确指定CGO_ENABLED=1

  • 哦,我忘了!你还需要在 make.bash 中添加 --no-clean 标志,否则它可能会覆盖你的旧安装(如果发生这种情况,不用担心 - 只需再次运行带有 --no-clean 标志的 make.bash 即可为您的旧配置重新运行)。 - joshlf
    1
    我建议使用go env GOROOT(或者仅使用go env来显示所有信息,但是GOROOT是您想要的)代替which go。即使您没有设置GOROOT环境变量(建议不要这样做),这也将向您显示go期望找到其工具和文件的位置。 - Dave C

    1

    根据上面的答案https://dev59.com/LV4c5IYBdhLWcg3w59uQ#27413148,我需要设置GOROOT_BOOTSTRAP来重新编译我的GO源代码树:

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

    我正在使用 Fedora 23,所以 GOROOT_BOOTSTRAP 在您的操作系统中可能会有所不同。


    -1

    你必须执行 cd %goroot%/src/ 命令,找到 make.bash

    然后执行 ./make.bash

    执行你的命令。试试看!


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接