一尘不染

在 OSX 上交叉编译?

go

我正在尝试在 OSX 上交叉编译一个 go 应用程序来为 windows 和 linux 构建二进制文件。我已经阅读了我在网上能找到的所有内容。我发现的最接近的例子已经发布(除了关于 go-nuts 邮件列表的许多未完成的讨论):

http://solovyov.net/en/2012/03/09/cross-compiling-go/

但它不适用于我的安装。我已经去了 1.0.2。由于 1.0.2 是最新的,在我看来,上面的所有例子都不适用于这个版本。

试图将./make.bash --no-cleanENV 变量设置为 386/windows,它确实构建了 go,但是它为我的安装构建了 go,这darwin/amd64完全忽略了 ENV 中设置的假设构建不同编译器的内容。

任何建议如何完成(如果可以完成)?


阅读 176

收藏
2021-11-10

共2个答案

一尘不染

在 Go 1.5 中,他们似乎改进了交叉编译过程,这意味着它现在已内置。不需要./make.bash-ing 或brew-ing。此处描述该过程但对于 TLDR 人员(如我)而言:您只需设置GOOSGOARCH环境变量并运行 go build。

对于那些更懒惰的复制粘贴者(像我一样),如果您使用的是 *nix 系统,请执行以下操作:

env GOOS=linux GOARCH=arm go build -v github.com/path/to/your/app

你甚至学会了这个env技巧,它让你只为那个命令设置环境变量,完全免费。

2021-11-10
一尘不染

感谢 golang-nuts 的友好和耐心帮助,配方如下:

1) 需要针对不同的目标平台和架构编译 Go 编译器。这是从 go 安装中的 src 文件夹完成的。在我的情况下,Go 安装位于/usr/local/go因此编译编译器需要发出make实用程序。在执行此操作之前,您需要了解一些注意事项。

交叉编译时CGO库存在问题,需要禁用CGO库。

编译是通过将位置更改为源目录来完成的,因为编译必须在该文件夹中完成

cd /usr/local/go/src

然后编译 Go 编译器:

sudo GOOS=windows GOARCH=386 CGO_ENABLED=0 ./make.bash --no-clean

您需要通过更改 GOOS 和 GOARCH 参数,为您希望交叉编译的每个操作系统和架构重复此步骤。

如果您像我一样在用户模式下工作,则需要 sudo,因为 Go 编译器位于系统目录中。否则,您需要以超级用户身份登录。在 Mac 上,您可能需要启用/配置 SU 访问权限(默认情况下不可用),但如果您已成功安装 Go,您可能已经拥有 root 访问权限。

2) 一旦您构建了所有交叉编译器,您就可以使用以下设置愉快地交叉编译您的应用程序,例如:

GOOS=windows GOARCH=386 go build -o appname.exe appname.go

GOOS=linux GOARCH=386 CGO_ENABLED=0 go build -o appname.linux appname.go

将 GOOS 和 GOARCH 更改为您希望构建的目标。

如果您遇到 CGO 问题,请在命令行中包含 CGO_ENABLED=0。另请注意,linux 和 mac 的二进制文件没有扩展名,因此您可以添加扩展名以拥有不同的文件。-o 开关指示 Go 使输出文件类似于 c/c++ 的旧编译器,因此上面使用的 appname.linux 可以是任何其他扩展名。

2021-11-10