Go 从Windows到Linux/Ubuntu的1.7交叉编译
我的Windows 10上安装了GO 1.7。我创建了一个测试程序,它在Windows中运行得非常好。下一步是尝试用Ubuntu在我的docker虚拟机上运行它 我找到了一些关于方法的信息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
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
将不起作用。我认为交叉编译时,您仍然必须安装目标平台的标准库。我使用iesudo 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