Go 从Windows到Linux/Ubuntu的1.7交叉编译

Go 从Windows到Linux/Ubuntu的1.7交叉编译,go,cross-platform,Go,Cross Platform,我的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 我在cmd中运行了第1行和第2行,没有问题。在第3行我有一个错误 go tool dist: open C:\Go\src\pkg

我的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
我在cmd中运行了第1行和第2行,没有问题。在第3行我有一个错误

go tool dist: open C:\Go\src\pkg\runtime: The system cannot find the path specified.
我手动检查此文件夹,并且只有windows运行时

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

更新日期2017年2月9日

我像建议的那样跑步

set GOARCH=amd64
set GOOS=linux
go build -o "myapp"
将此文件复制到共享文件夹后,将其中的表单复制到另一个非共享文件夹(以避免出现上述问题)并执行

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可执行文件。

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

跨平台支持发展了很多,您只需更改环境变量(
GOARCH
GOOS
)并运行
go build

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

set GOARCH=amd64
set GOOS=linux
go build
您可以更改结果二进制文件的名称,如下所示:

go build -o "myapp"
请注意,在Linux中,要编译适用于Windows amd64的应用程序,一个命令就足够了(在
main
包的文件夹中):

这一点在博客帖子中也得到了证实:

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

  • GOOS
    GOARCH
    设置为目标的值

  • 运行
    go build-v YOURPACKAGE

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

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

    也在博客帖子中确认::

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

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


    我找到了一个问题和解决办法

    在我的Windows 10中,这些命令

    set GOARCH=amd64
    set GOOS=linux
    
    在cmd和powershell控制台中,实际上什么都没做!它唯一的工作方式是,我需要打开控制面板->系统->系统高级设置->环境变量,然后手动将它们添加到那里

    如果您使用VisualStudio代码进行开发,请不要忘记重新启动它

    2017年2月24日更新

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

    $env:GOOS=“linux”

    把它读给我听

    $env:GOOS


    在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机器(RHEL7.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
    

    您需要使用正确的外壳,如图所示。例如,
    Windows
    Linux
    将不起作用。

    我认为交叉编译时,您仍然必须安装目标平台的标准库。我使用ie
    sudo env GOOS=windows GOARCH=amd64/usr/local/go/bin/go install std
    在我的Ubuntu上为win64启用交叉编译。@不,它没有。在Linux中,您只需在主软件包(刚刚验证)的文件夹中运行
    GOOS=windows GOARCH=amd64 go build
    。是否已经安装了std?在我上一次升级go(到1.7)后,为了能够交叉编译,我必须在我的第一条注释中使用该命令。当然,一旦你安装了它,你就可以从那时开始构建…@ain不,只是官方页面上的“裸”二进制Go发行版。go工具将重新编译从标准库(从源代码)到目标os/arch所需的所有内容,这就是为什么需要更长的时间。@要添加,您始终可以运行
    go工具dist list
    来列出您安装的go支持的os/arch组合。我想您不需要第三个命令,只需安装std(即
    go install std
    )就足够了。“设置
    命令实际上什么也没做!”
    SET
    命令不在系统范围内设置环境变量,仅在当前命令shell中设置。因此,对于其他shell和应用程序,它没有任何效果,这不是秘密。但对于当前命令shell,它甚至没有设置。我设置它,生成,将我的文件复制到我的linux容器,运行“文件”comand并查看该文件是为windows生成的。仅w
    go env -w GOOS=windows