web-dev-qa-db-ja.com

OSXでGoをクロスコンパイルしますか?

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の設定を完全に無視します。

どのようにそれを行うことができますか(何かできる場合)?

127
ljgww

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トリックを学んだので、そのコマンドのみに環境変数を設定でき、完全に無料です。

127
leondepeon

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は他の拡張子でもかまいません。

134
ljgww

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を使用します。

63
docwhat

これは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

21
Travis Reeder

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
5
Pouya Sanooei

多くのプラットフォームで実行可能ファイルを作成するプロセスは少し面倒なので、スクリプトを使用することをお勧めします。

#!/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でのみ確認しました

要旨-go-executable-build.sh

5
Dima Kozhevin