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

时间:2017-02-08 16:02:05

标签: go cross-platform

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

我找到了here有关如何做到这一点的一些信息

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

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

go tool dist: open C:\Go\src\pkg\runtime: The system cannot find the path specified.

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

enter image description here

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

更新09/02/2017

我按照建议跑了

set GOARCH=amd64
set GOOS=linux
go build -o "myapp"

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

root@7dd1655ae5db:/__notshared# ./myapp
bash: ./myapp: cannot execute binary file: Exec format error

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

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

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

3 个答案:

答案 0 :(得分:4)

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

跨平台支持发展很多,您需要做的就是更改环境变量(GOARCHGOOS)并运行go build

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

set GOARCH=amd64
set GOOS=linux
go build

您可以更改结果二进制文件的名称,如下所示:

go build -o "myapp"

请注意,在Linux中为Windows amd64编译应用程序,单个命令就足够了(在main包的文件夹中):

GOOS=windows GOARCH=amd64 go build

博客文章中也证实了这一点:Dave Cheney: Cross compilation with Go 1.5

  

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

     
      
  1. GOOSGOARCH设置为目标operating system and architecture的值。

  2.   
  3. 运行go build -v YOURPACKAGE

  4.   

注释

您不必这样做,并且您不应该运行go install,因为这将编译并安装GOPATH中的软件包,这通常是不需要的。进行交叉编译不适用于开发/测试您的应用和包。它是生成一个二进制文件,您将在另一个系统/计算机上运行。

go build不会安装任何东西,它只会产生可执行的二进制文件。有关详细信息,请参阅What does go build build?

在博文中也得到了证实:Dave Cheney: Cross compilation with Go 1.5

  

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

     

原因是go install始终将已编译的包.a文件缓存到与源代码根相匹配的pkg/目录中。

答案 1 :(得分:2)

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

在我的Windows 10中这些命令

set GOARCH=amd64
set GOOS=linux

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

enter image description here

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

更新24/02/2017

相反,你可以在windows powershell中设置变量,如下所示

  

$ env:GOOS =" linux"

并将其读取到控制台

  

$ ENV:GOOS

答案 2 :(得分:0)

在Windows 10和Go 1.14上对我有用的是:

go env -w GOARCH=amd64
go env -w GOOS=linux
go build -o test-linux test.go

就是这样。

我在Windows命令提示符和Windows PowerShell中都尝试过此操作。结果没有差异。

如果在文本编辑器中打开二进制文件,则应该看到它以ELF(Linux)开头,而不是以MZ(Windows)开头。

我在具有给定体系结构的Linux机器(RHEL 7.3)上运行了它,并且工作正常。它给出了正确的输出。

将文件复制到Linux机器后,我必须使其可执行:

$ chmod +x test-linux

然后我可以运行它:

$ ./test-linux

您还可以在Linux上运行以下命令,以获取有关该文件的更多详细信息:

$ file test-linux
test-linux: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped

当然,如果您的体系结构已经是amd64,则无需再次进行设置。您只需设置GOOS

完成交叉编译后,您也可以将GOOS还原为windows。当我关闭Windows命令提示符和PowerShell并运行go env以查看Go环境变量列表时,GOOS保留了linux的值。我没有尝试重新启动Windows。因此,如果您现在想再次为Windows编译:

go env -w GOOS=windows

您需要使用正确的外壳,如下所示。例如,WindowsLinux无效。