OSXでgoアプリをクロスコンパイルして、WindowsおよびLinux用のバイナリをビルドしようとしています。私はネットで見つけることができるものをすべて読みました。私が見つけた最も近い例が公開されています(ゴーナットメーリングリストでの多くの未完の議論は別として):
http://solovyov.net/en/2012/03/09/cross-compiling-go/
まだ私のインストールでは動作しません。 1.0.2に進みました。 1.0.2はごく最近のものであるため、上記の例はすべてこのバージョンには当てはまらないようです。
ENV varsを386/windowsに設定して./make.bash --no-clean
を実行しようとしましたが、ビルドは実行されますが、darwin/AMD64
であるインストール用にビルドが実行され、異なるコンパイラをビルドすると想定されるENVの設定を完全に無視します。
どのようにそれを行うことができますか(何かできる場合)?
Go 1.5では、クロスコンパイルプロセスが改善されたように見えます。つまり、現在は組み込まれています。 ./make.bash
- ingまたはbrew
- ingは必要ありません。プロセスは ここ で説明されていますが、TLDR-ers(私のような)の場合:GOOS
およびGOARCH
環境変数を設定してgoビルドを実行します。
怠likeなコピーペースト(私のような)でも、* nixシステムを使用している場合は次のようにします。
env GOOS=linux GOARCH=arm go build -v github.com/path/to/your/app
env
トリックを学んだので、そのコマンドのみに環境変数を設定でき、完全に無料です。
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パラメーターを変更して、クロスコンパイルするOSおよびアーキテクチャごとにこの手順を繰り返す必要があります。
私のようにユーザーモードで作業している場合、Goコンパイラはシステムディレクトリにあるため、Sudoが必要です。それ以外の場合は、スーパーユーザーとしてログインする必要があります。 Macでは、SUアクセスを有効化/構成する必要がある場合があります(デフォルトでは使用できません)が、Goをインストールできた場合は、すでにルートアクセス権があります。
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スイッチは、c/c ++の古いコンパイラと同様の出力ファイルを作成するようにGoに指示します。したがって、上記で使用されるappname.linuxは他の拡張子でもかまいません。
OS Xで Homebrew を使用すると、より簡単なソリューションが得られます。
$ brew install go --with-cc-common # Linux, Darwin, and Windows
または..
$ brew install go --with-cc-all # All the cross-compilers
既にreinstall
がインストールされている場合は、go
を使用します。
これは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
'
この投稿で詳細を見つけることができます: https://medium.com/iron-io-blog/how-to-cross-compile-go-programs-using-docker-beaa102a316d
CGOを有効にし、OSXターゲティングウィンドウからクロスコンパイルが必要な人向け
https://github.com/mattn/をインポートしてから、MacからWindows用にコンパイルする際に有効にしたCGOが必要でしたgo-sqlite そしてそれが必要でした。他の回答に従ってコンパイルすると、私とエラーが発生しました:
/usr/local/go/src/runtime/cgo/gcc_windows_AMD64.c:8:10: fatal error: 'windows.h' file not found
あなたが私のような人で、CGOでコンパイルする必要がある場合。これは私がやったことです:
1. CGO依存ライブラリを使用するウィンドウのクロスコンパイルを行います。最初に、mingw-w64
のようにインストールされたクロスコンパイラが必要です
brew install mingw-w64
おそらくここにインストールされます/usr/local/opt/mingw-w64/bin/
。
2.他の回答と同様に、まずWindows Archをgoコンパイラツールチェーンに追加する必要があります。コンパイラーのコンパイルにはコンパイラー(奇妙な文)が必要です。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を有効にしたWindowsターゲティングウィンドウをコンパイルします。
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
多くのプラットフォームで実行可能ファイルを作成するプロセスは少し面倒なので、スクリプトを使用することをお勧めします。
#!/usr/bin/env bash
package=$1
if [[ -z "$package" ]]; then
echo "usage: $0 <package-name>"
exit 1
fi
package_name=$package
#the full list of the platforms: https://golang.org/doc/install/source#environment
platforms=(
"darwin/386"
"dragonfly/AMD64"
"freebsd/386"
"freebsd/AMD64"
"freebsd/arm"
"linux/386"
"linux/AMD64"
"linux/arm"
"linux/arm64"
"netbsd/386"
"netbsd/AMD64"
"netbsd/arm"
"openbsd/386"
"openbsd/AMD64"
"openbsd/arm"
"plan9/386"
"plan9/AMD64"
"solaris/AMD64"
"windows/AMD64"
"windows/386" )
for platform in "${platforms[@]}"
do
platform_split=(${platform//\// })
GOOS=${platform_split[0]}
GOARCH=${platform_split[1]}
output_name=$package_name'-'$GOOS'-'$GOARCH
if [ $GOOS = "windows" ]; then
output_name+='.exe'
fi
env GOOS=$GOOS GOARCH=$GOARCH go build -o $output_name $package
if [ $? -ne 0 ]; then
echo 'An error has occurred! Aborting the script execution...'
exit 1
fi
done
このスクリプトはOSXでのみ確認しました