【问题标题】:How to cross compile from Windows to Linux?如何从 Windows 交叉编译到 Linux?
【发布时间】:2014-01-16 17:24:58
【问题描述】:

我在 Windows 机器上安装了 Go 1.2,编写了一个虚拟程序并将环境变量 GOARCHGOOS 分别设置为“AMD64”和“linux”。

当我发出“go build”命令时,我收到一个错误:

go build runtime: linux/amd64 must be bootstrapped using make.bat

这是什么意思?

【问题讨论】:

    标签: go cross-compiling


    【解决方案1】:

    要交叉编译 Go,首先你需要能够从源代码构建 Go。为此,您似乎需要安装 MinGW 才能获得 gcc 和其他工具。有关这方面的帮助,请访问 https://code.google.com/p/go-wiki/wiki/WindowsBuild

    从那里开始,如果它类似于 Linux 交叉编译,情况如下:

    首先将cd 添加到您的go\src 目录。如果您不确定它在哪里,请输入go env,您会在输出中看到类似GOROOT="\some\dir\" 的行;就做cd \some\dir\src\

    然后,设置GOOS=linuxGOARCH=amd64,输入.\make.bat,这将构建针对Linux 的Go 编译器等版本。那么你应该不会再收到这个错误了。

    【讨论】:

    • 这是一个批处理文件(想想过去的 AUTOEXEC.bat),其中包含在您的系统上构建 Go 的命令。
    • 在你运行make.bat之前,你需要从MinGW下载并安装gcc编译器。我已经为此添加了说明。
    【解决方案2】:

    它告诉你它需要在你使用它们之前构建所有工具。

    如果你的 windows GOARCH 是 amd64,那么你可以通过运行这个小批量程序来“构建”所有需要的工具:

    set GOARCH=amd64
    set GOOS=linux
    go tool dist install -v pkg/runtime
    go install -v -a std
    

    如果成功,那么您应该能够执行您所描述的操作(只使用 amd64,而不是 AMD64 - 它区分大小写)。

    如果您的 windows GOARCH 是 386,那么您需要先构建您的 386 工具。您需要为此下载 mingw gcc。按照user2714852所说的去做。

    https://golang.org/wiki/WindowsCrossCompiling 这里有类似的 linux 指令,也许你会觉得它们有帮助。

    亚历克斯

    【讨论】:

    • 我用的是go 1.7.5,好像只有set GOOS=linux可以编译linux版本。
    • go tool dist install -v pkg/runtime 是做什么的?
    • @lanoxx 在非常旧的 Go 版本中需要该命令。如果您使用 go1.12,只需设置 GOARCH 和 GOOS 并运行“go install”或“go build”命令。
    • 感谢您的澄清。我已经安装了 1.11.4 并且在运行该命令时收到错误,但最终它没有工作。
    【解决方案3】:

    我在从 Windows 构建 linux 时遇到了一些重大问题,归根结底,它相当简单。我会评论 Alex 的帖子,但我不能,因为我是 stackoverflow 新手。

    正如亚历克斯所说,设置environment variables。这必须以管理员身份完成(例如,右键单击“命令提示符”或“Powershell”快捷方式,然后单击“以管理员身份运行”)

    set GOARCH=amd64
    set GOOS=linux
    

    如果您使用 Powershell,请使用

    $Env:GOOS = "linux"; $Env:GOARCH = "amd64"
    

    如果您不以管理员身份执行此操作,变量将不会生效,您将只是为您当前所在的操作系统和架构构建它。

    我发现通过运行 go env 检查你的 go 环境变量总是很好的,它会为你提供当前 go 环境变量的列表

    go env
    set GOARCH=amd64
    set GOBIN=
    set GOEXE=
    set GOHOSTARCH=amd64
    set GOHOSTOS=windows
    set GOOS=linux
    set GOPATH=T:\Projects\gopath
    set GORACE=
    set GOROOT=C:\Go
    set GOTOOLDIR=C:\Go\pkg\tool\windows_amd64
    set GCCGO=gccgo
    set CC=gcc
    set GOGCCFLAGS=-fPIC -m64 -fmessage-length=0
    set CXX=g++
    set CGO_ENABLED=0
    set PKG_CONFIG=pkg-config
    set CGO_CFLAGS=-g -O2
    set CGO_CPPFLAGS=
    set CGO_CXXFLAGS=-g -O2
    set CGO_FFLAGS=-g -O2
    set CGO_LDFLAGS=-g -O2
    

    确保将 GOOS 和 GOARCH 设置为您之前指定的值。

    如果一切顺利,您应该能够导航到包含您的 go 代码的目录,然后从命令行运行:

    go build
    

    这将为环境变量中设置的系统和架构构建包。
    当我终于弄清楚这一点后,我遇到了其他一些问题,但那是与这个问题无关的另一件事。

    【讨论】:

    • 我通过以管理员身份运行 PS 完全设置了 GOARCH=amd64GOOS=linux,唉,当我运行 go env 时,结果确实显示出任何影响。 Windows 10,去go1.14.1 windows/amd64
    • 好吧,作为this answer,我在使用PS时应该使用另一种方法。 $Env:GOOS = "linux"; $Env:GOARCH = "amd64"。它奏效了。请更改您的答案并添加这一重要信息。谢谢。
    【解决方案4】:

    要设置 PowerShell 环境变量,请使用(无需管理员模式):
    $env:GOOS = "linux"
    比构建你的程序go build

    更改后的环境变量仅在当前 PowerShell 窗口中显示。当你重新打开窗口时,一切都会被重置。

    【讨论】:

      【解决方案5】:

      如果您使用docker,您可以为linux 构建一个docker image。例如:

      首先你可以准备一个DockerFile如下:

      FROM golang:1.15-alpine3.12 as builder
      
      RUN mkdir /go/src/hello
      
      WORKDIR /go/src/hello
      
      #install nano, zip and git
      RUN apk add nano zip git
      
      COPY ./ ./
      
      #build main
      RUN GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o main
      
      #zip main
      RUN zip main.zip main
      

      然后你可以用docker build -t yourname/hello . 构建一个图像之后必须从这个图像中导出你的 zip 文件:

      • 首先,将图像作为容器使用命令docker run -it yourname / hello
      • 其次,打开一个新终端并运行docker ps 以查看容器ID。
      • 最后,运行命令docker cp YOUR_WORKING_CONTAINER_ID:/go/src/hello/main.zip . 导出压缩文件。

      这可能会有很长的路要走,但它允许您使用docker 构建而不依赖于平台。下面是我开发的一个示例,用于使用docker image 更新golang lambda 函数(通过aws-cli)。

      【讨论】:

      • 问题与 Docker 无关
      • Docker 是在任何操作系统上构建 golang 应用程序的一个选项
      • linux/amd64 must be bootstrapped using make.bat OP 特别想知道;这是什么意思? OP 知道我们可以使用 go 在 windows 平台上构建 linux 二进制文件。
      • @Nilesh:他在回答“如何从 Windows 交叉编译到 Linux?”的问题。
      猜你喜欢
      • 2021-11-20
      • 2022-06-12
      • 1970-01-01
      • 2023-01-27
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      • 2021-06-02
      • 2018-01-14
      相关资源
      最近更新 更多