如何从Windows交叉编译到Linux?

时间:2013-12-29 19:22:12

标签: go cross-compiling

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

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

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

这是什么意思?

5 个答案:

答案 0 :(得分:34)

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

如果您的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的类似说明,也许你觉得它们很有帮助。

亚历

答案 1 :(得分:9)

我在从windows构建Linux时遇到了一些重大问题。最后,它非常简单。我会评论亚历克斯的帖子,但我不能,因为我是一个stackoverflow newb。

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

set GOARCH=amd64
set GOOS=linux

如果您不以管理员身份执行此操作,则变量将不会生效,您只需为OS&你现在所处的建筑。

我发现通过运行go env检查你的环境变量总是很好的,它给你了当前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

这将构建在环境变量中设置的系统和架构的包 一旦我终于解决了这个问题,我就遇到了一些其他问题,但这是与此问题无关的另一个问题。

答案 2 :(得分:8)

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

更改后的环境变量仅在当前PowerShell窗口中存在。重新打开窗口后,所有内容都会重置。

答案 3 :(得分: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编译器等版本。那你就不应该再犯这个错误了。

答案 4 :(得分:-1)

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

首先,您可以按如下方式准备一个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 . 以导出 zip 文件。

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