交叉编译去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.bash
或brew
-ing需要。 这里描述了这个过程,但是对于TLDR-ers(像我一样):只需设置GOOS
和GOARCH
环境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