如何从Windows交叉编译到Linux?

Dan*_*nte 28 cross-compiling go

我已经在Windows机器上安装了Go 1.2,编写了一个虚拟程序并分别设置了环境变量GOARCHGOOS"AMD64"和"linux".

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

go build runtime: linux/amd64 must be bootstrapped using make.bat
Run Code Online (Sandbox Code Playgroud)

这是什么意思?

ale*_*lex 38

它告诉你它需要所有工具才能使用它们.

如果您的Windows GOARCH是amd64,那么您可以通过运行这个小批量程序来"构建"所有必需的工具:

set GOARCH=amd64
set GOOS=linux
go tool dist install -v pkg/runtime
go install -v -a std
Run Code Online (Sandbox Code Playgroud)

如果成功,那么你应该能够做你所描述的(只使用amd64,而不是AMD64 - 它区分大小写).

如果您的Windows GOARCH是386,那么您需要先构建386工具.您需要为此下载mingw gcc.做什么user2714852说.

这里https://golang.org/wiki/WindowsCrossCompiling是linux的类似说明,也许你觉得它们很有帮助.

亚历克斯

  • 我正在使用go 1.7.5,似乎只有`set GOOS = linux`可以构建linux版本。 (2认同)
  • @lanoxx 在非常旧的 Go 版本中需要该命令。如果您使用go1.12,只需设置GOARCH和GOOS并运行“go install”或“go build”命令。 (2认同)

小智 13

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

更改的环境变量仅在当前PowerShell窗口中显示.重新打开窗口时,所有内容都将被重置.


小智 12

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

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

set GOARCH=amd64
set GOOS=linux
Run Code Online (Sandbox Code Playgroud)

如果您不以管理员身份执行此操作,则变量将不会生效,您只需为此处的操作系统和体系结构构建它.

我发现通过运行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
Run Code Online (Sandbox Code Playgroud)

确保GOOS&GOARCH设置为您之前指定的值.

如果这一切都很好,您应该能够导航到包含您的go代码的目录,并从命令行运行:

go build
Run Code Online (Sandbox Code Playgroud)

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

  • 好吧,正如[这个答案](/sf/answers/3956049471/),当我使用PS时,我应该使用另一种方法。`$Env:GOOS = "linux"; $Env:GOARCH = "amd64"`。它已经奏效了。请更改您的答案并添加这一重要部分。谢谢。 (2认同)