从Windows到Linux/Ubuntu进行1.7交叉编译

Vit*_*lii 7 cross-platform go

我在Windows 10上安装了GO 1.7.我创建了测试程序,它在Windows中运行良好.下一步是尝试使用Ubuntu在我的docker虚拟机上运行它.

我在这里找到了一些关于如何做到这一点的信息

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

我在cmd中运行第1行和第2行,没有问题.在第3行,我有一个错误

go tool dist: open C:\Go\src\pkg\runtime: The system cannot find the path specified.
Run Code Online (Sandbox Code Playgroud)

我手动检查这个文件夹,只有Windows的运行时

在此输入图像描述

问题是我在哪里以及如何下载它?或者也许我正在做的是完全错误的方式......

更新09/02/2017

我按照建议跑了

set GOARCH=amd64
set GOOS=linux
go build -o "myapp"
Run Code Online (Sandbox Code Playgroud)

将此文件复制到共享文件夹后,将表单复制到另一个非共享文件夹(以避免此处描述的问题)并执行

root@7dd1655ae5db:/__notshared# ./myapp
bash: ./myapp: cannot execute binary file: Exec format error
Run Code Online (Sandbox Code Playgroud)

我下载文件包后检查了我的文件

root@7dd1655ae5db:/__notshared# file myapp
myapp: PE32+ executable (console) x86-64 (stripped to external PDB), for MS Windows
Run Code Online (Sandbox Code Playgroud)

似乎在构建期间没有创建linux可执行文件.

Vit*_*lii 7

我发现了一个问题并解决了它。

在我的 Windows 10 中,这些命令

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

在 cmd 和 powershell 控制台中实际上什么也没做!唯一的工作方式是我需要打开控制面板 -> 系统 -> 系统高级设置 -> 环境变量并手动添加它们。

在此处输入图片说明

如果您使用 Visual Studio Code 进行开发,请不要忘记重新启动它。

更新 24/02/2017

相反,您可以像这样在 windows powershell 中设置变量

$env:GOOS = "linux"

并将其读到控制台

$env:GOOS

  • _“`SET` 命令实际上什么也没做!”_ `SET` 命令不会在系统范围内设置环境变量,仅在当前命令外壳中设置。所以对其他 shell 和应用程序没有影响,这已经不是什么秘密了。 (2认同)

icz*_*cza 6

另一个问题有点老了(从2013年开始)。

跨平台支持已经发展了很多,您所需要做的就是更改环境变量(GOARCH和GOOS)并运行go build。

导航到main程序包的文件夹,然后:

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

您可以像这样更改结果二进制文件的名称:

go build -o "myapp"
Run Code Online (Sandbox Code Playgroud)

请注意,在Linux中为Windows amd64编译应用程序,只需一个命令即可(在main软件包的文件夹中):

GOOS=windows GOARCH=amd64 go build
Run Code Online (Sandbox Code Playgroud)

博客文章:Dave Cheney:与Go 1.5交叉编译也证实了这一点:

要使用Go 1.5交叉编译Go程序,过程如下:

  1. 设置GOOS并GOARCH作为目标操作系统和体系结构的值。

  2. 跑 go build -v YOURPACKAGE

笔记

您不必也不应运行go install,因为那样会编译软件包并将其安装在您的中GOPATH,这通常是不需要的。进行交叉编译不是为了开发/测试您的应用程序和程序包。它是产生一个二进制文件,您将在另一台系统/计算机上运行它。

go build不会安装任何东西,只会生成可执行二进制文件。有关详细信息,请参阅构建什么版本?

在博客文章中也得到了证实:Dave Cheney:与Go 1.5交叉编译:

交叉编译时,应使用go build,而不是go install。这是go build优于的少数情况之一go install。

这样做的原因go install总是将已编译的程序包,.a文件缓存到pkg/与源代码的根匹配的目录中。

  • @ain不,不是。在Linux中,您需要做的就是在主程序包的文件夹中运行“ GOOS = windows GOARCH = amd64 go build”(只需验证一下)。 (3认同)
  • @ain不,只是官方的[Downloads](https://golang.org/dl/)页面上的“裸”二进制Go发行版。go工具将重新编译从标准库(从源文件)到目标os / arch所需的所有内容,这就是为什么它需要更长的时间的原因。 (3认同)
  • @ain 要补充的是,您始终可以运行“go tool dist list”来列出您安装的 Go 支持的 OS/ARCH 组合。 (2认同)