我在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的运行时
问题是我在哪里以及如何下载它?或者也许我正在做的事情是完全错误的......
更新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可执行文件。
答案 0 :(得分:4)
另一个问题有点旧(从2013年开始)。
跨平台支持发展很多,您需要做的就是更改环境变量(GOARCH
和GOOS
)并运行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程序,过程如下:
将
GOOS
和GOARCH
设置为目标operating system and architecture的值。- 醇>
运行
go build -v YOURPACKAGE
您不必这样做,并且您不应该运行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控制台中什么都没做!只有它的工作方式是我需要打开控制面板 - >系统 - >系统高级设置 - >环境变量并手动添加它们。
如果使用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
您需要使用正确的外壳,如下所示。例如,Windows
或Linux
无效。