154

OSXでgoアプリをクロスコンパイルして、WindowsとLinux用のバイナリをビルドしようとしています。私はネット上で見つけたものをすべて読みました。私が見つけた最も近い例は、(go-nutsメーリングリストでの多くの未完成の議論を除いて)公開されています:

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

それでも、私のインストールでは機能しません。私は1.0.2に行きました。1.0.2はごく最近のものであるため、上記のすべての例がこのバージョンに適用されるわけではないように思われます。

386 / windowsに設定されたENV変数を使用して実行しようとしましたが、ビルドは実行されますが、別のコンパイラーをビルドすることを想定しているENVに設定されているものを完全に無視する./make.bash --no-clean、私のインストールではビルドが実行されます。darwin/amd64

それをどのように行うことができるか(それが可能である場合)、何かアドバイスはありますか?

4

8 に答える 8

199

Go 1.5では、クロスコンパイルプロセスが改善されたようです。つまり、現在組み込まれています。./make.bash-ingまたは-ingは必要ありませんbrew。プロセスはここで説明されていますが、TLDR-er(私のような)の場合は、GOOSGOARCH環境変数を設定し、goビルドを実行するだけです。

(私のような)さらに怠惰なコピーペーストの場合、* nixシステムを使用している場合は、次のようにします。

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

envそのコマンドのみに環境変数を完全に無料で設定できるトリックも学びました。

于 2016-03-08T21:43:53.413 に答える
142

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をインストールできた場合は、すでに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 switchは、出力ファイルをc / c ++の古いコンパイラと同様にするようにGoに指示します。したがって、上記で使用したappname.linuxは他の拡張子にすることができます。

于 2012-08-30T18:05:11.187 に答える
63

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

于 2015-02-10T02:46:21.403 に答える
25

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

于 2015-07-08T20:52:49.587 に答える
10

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

#!/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

于 2018-12-02T19:27:06.943 に答える
7

CGOを有効にしてOSXターゲティングウィンドウからクロスコンパイルする必要がある人向け

https://github.com/mattn/go-sqlite3をインポートしていて、それが必要だったので、MacからWindows用にコンパイルするときにCGOを有効にする必要がありました。他の答えに従ってコンパイルすると、私とエラーが発生しました:

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

あなたが私のようで、CGOでコンパイルする必要がある場合。これは私がしたことです:

1.CGOに依存するライブラリを使用してWindowsのクロスコンパイルを行います。まず、次のようなクロスコンパイラをインストールする必要がありますmingw-w64

brew install mingw-w64

これはおそらくここにインストールされます/usr/local/opt/mingw-w64/bin/

2.他の回答と同様に、最初にWindowsアーチを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が有効になっているウィンドウをターゲットとする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
于 2017-02-17T13:38:23.137 に答える
2

go 1.17.1以降、goenv変数を明示的に設定する必要があります。

シェルスクリプトでやった

#!/bin/bash

GOOS=linux 
GOARCH=amd64
go.exe get -d -v ./...
go.exe env -w GOOS=$GOOS
go.exe env -w GOARCH=$GOARCH
go.exe build -v ./cmd/tecnoalarm/main.go

于 2021-09-28T12:17:30.633 に答える
1

CGOを有効にして別のシステムからクロスコンパイルする必要がある人向け

Dockerソリューションが1つありますgolang-crossbuild

linux/armv7これは、Windows/MacOSでビルドする1つの例です

docker run -it --rm \
  -v $GOPATH/src/github.com/user/go-project:/go/src/github.com/user/go-project \
  -w /go/src/github.com/user/go-project \
  -e CGO_ENABLED=1 \
  docker.elastic.co/beats-dev/golang-crossbuild:1.16.4-armhf \
  --build-cmd "make build" \
  -p "linux/armv7"
于 2021-08-20T11:48:36.050 に答える