交叉编译去OSX上?

我正在尝试在OSX上交叉编译一个应用程序来为Windows和Linux构build二进制文件。 我已经阅读了所有我能在网上find的东西。 我发现的最近的一个例子已经发表(除了很多未完成的讨论外,我还发现了这个问题):

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

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

试图做./make.bash --no-clean与ENVvariables设置为386 /窗口,它确实build立去,但它build立去我的安装,这是darwin/amd64 ,完全忽略了什么设置在ENV,假设build立不同的编译器

任何build议如何做(如果可以完成的话)?

使用Go 1.5,他们似乎已经改进了交叉编译过程,这意味着它现在已经build立了。 没有./make.bashbrew -ing需要。 这里描述了这个过程,但是对于TLDR-ers(像我一样):只需设置GOOSGOARCH环境variables并运行go build。

对于那些懒惰的副本(像我一样),如果你在一个* nix系统上,可以这样做:

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

你甚至可以学习env技巧,它可以让你只为那个命令设置环境variables,完全免费。

感谢来自golang坚果的仁慈和耐心的帮助,配方如下:

1)需要为不同的目标平台和体系结构编译Go编译器。 这是从安装中的src文件夹完成的。 在我的情况下去安装位于/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,因为编译器位于系统目录中,否则需要以超级用户身份login。 在Mac上,您可能需要启用/configurationSU访问(默认情况下不可用),但是如果您已设法安装,则可能已具有root访问权限。

2)一旦你build立了所有的交叉编译器,你可以通过使用设置来愉快地交叉编译你的应用程序,例如:

 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更改为您希望构build的目标。

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

如果你在OS X上使用Homebrew ,那么你有一个更简单的解决scheme:

 $ brew install go --with-cc-common # Linux, Darwin, and Windows 

要么..

 $ brew install go --with-cc-all # All the cross-compilers 

如果您已经reinstall ,请使用reinstall安装。

你可以很容易地使用Docker来做到这一点,所以不需要额外的库。 只要运行这个命令:

 docker run --rm -it -v "$GOPATH":/go -w /go/src/github.com/iron-io/ironcli golang:1.4.2-cross sh -c ' for GOOS in darwin linux windows; do for GOARCH in 386 amd64; do echo "Building $GOOS-$GOARCH" export GOOS=$GOOS export GOARCH=$GOARCH go build -o bin/ironcli-$GOOS-$GOARCH done done ' 

你可以在这篇文章中find更多的细节: https : //medium.com/iron-io-blog/how-to-cross-compile-go-programs-using-docker-beaa102a316d

对于那些需要启用CGO并且从OSX定位窗口进行交叉编译的人

我需要从我的Mac编译窗口,因为我已经导入https://github.com/mattn/go-sqlite3 ,并需要它启用CGO 。 根据其他答案编译给了我和错误:

 /usr/local/go/src/runtime/cgo/gcc_windows_amd64.c:8:10: fatal error: 'windows.h' file not found 

如果你像我一样,你必须与CGO编译。 这就是我所做的:

我们将要为CGO依赖的库进行交叉编译。 首先,我们需要一个像mingw-w64一样安装的交叉编译器

 brew install mingw-w64 

这可能会将其安装在/usr/local/opt/mingw-w64/bin/

和其他答案一样,我们现在首先需要将我们的windows arch添加到我们的编译器工具链中。 编译编译器需要一个编译器(奇怪的句子)编译go编译器需要一个单独的预编译器。 我们可以下载一个预编译的二进制文件,或者从一个文件夹的源代码编译,例如: ~/Documents/go现在我们可以改进我们的Go编译器,根据最高的答案,但是这次用CGO_ENABLED=1和我们单独的预编译器GOROOT_BOOTSTRAP (Pooya是我的用户名):

 cd /usr/local/go/src sudo GOOS=windows GOARCH=amd64 CGO_ENABLED=1 GOROOT_BOOTSTRAP=/Users/Pooya/Documents/go ./make.bash --no-clean sudo GOOS=windows GOARCH=386 CGO_ENABLED=1 GOROOT_BOOTSTRAP=/Users/Pooya/Documents/go ./make.bash --no-clean 

3.现在编译我们的Go代码时,使用mingw来编译我们的启用CGO的go文件定位窗口:

 GOOS="windows" GOARCH="386" CGO_ENABLED="1" CC="/usr/local/opt/mingw-w64/bin/i686-w64-mingw32-gcc" go build hello.go GOOS="windows" GOARCH="amd64" CGO_ENABLED="1" CC="/usr/local/opt/mingw-w64/bin/x86_64-w64-mingw32-gcc" go build hello.go