Go Wiki: Linux で Windows 用 Go プログラムをビルドする
利用可能な GOOS
と GOARCH
の値については、こちら を参照してください。
Go バージョン >= 1.5
Go バージョン 1.5 以降、純粋な Go 実行ファイルのクロスコンパイルは非常に簡単になりました。以下のコードで試してみてください。詳しくは、Dave Cheney 氏によるこのブログ記事をご覧ください。
$ cat hello.go
package main
import "fmt"
func main() {
fmt.Printf("Hello\n")
}
$ GOOS=windows GOARCH=386 go build -o hello.exe hello.go
PowerShell ではなく cmd.exe で
$ set GOOS=windows
$ set GOARCH=386
$ go build -o hello.exe hello.go
これで、近くの Windows マシンで hello.exe
を実行できます。
上記ののコマンドを初めて実行すると、標準ライブラリのほとんどがサイレントに再ビルドされるため、かなり遅くなります。Go コマンドのビルドキャッシュにより、後続のビルドは高速になります。
クロスコンパイル時には cgo
は無効になっているため、import "C"
と記述されているファイルはすべてサイレントに無視されます(https://github.com/golang/go/issues/24068) を参照)。cgo、またはビルドモード c-archive
、c-shared
、shared
、plugin
を使用するには、Cクロスコンパイラが必要です。
古い Go バージョン(<1.5)
私は linux/386 を使用していますが、この手順は他のホストプラットフォームにも適用できると思います。
準備(必要な場合)
sudo apt-get install gcc
export go env GOROOT
最初のステップは、ホストバージョンの Go をビルドすることです。
cd $GOROOT/src
sudo -E GOOS=windows GOARCH=386 PATH=$PATH ./make.bash
次に、残りの Go コンパイラとリンカをビルドする必要があります。私はそれを行うための小さなプログラムを持っています。
$ cat ~/bin/buildcmd
#!/bin/sh
set -e
for arch in 8 6; do
for cmd in a c g l; do
go tool dist install -v cmd/$arch$cmd
done
done
exit 0
最後のステップは、Windows バージョンの標準コマンドとライブラリをビルドすることです。私もそれのための小さなスクリプトを持っています。
$ cat ~/bin/buildpkg
#!/bin/sh
if [ -z "$1" ]; then
echo 'GOOS is not specified' 1>&2
exit 2
else
export GOOS=$1
if [ "$GOOS" = "windows" ]; then
export CGO_ENABLED=0
fi
fi
shift
if [ -n "$1" ]; then
export GOARCH=$1
fi
cd $GOROOT/src
go tool dist install -v pkg/runtime
go install -v -a std
私はそれをこのように実行します
$ ~/bin/buildpkg windows 386
Windows/386 バージョンの Go コマンドとパッケージをビルドします。私のスクリプトから、cgo 関連の部分のビルドを除外していることがわかるでしょう。対応する gcc クロスコンパイルツールがインストールされていないため、これらは私にとっては機能しません。そこで、それらをスキップします。
これで、Windows 実行ファイルをビルドする準備ができました
$ cat hello.go
package main
import "fmt"
func main() {
fmt.Printf("Hello\n")
}
$ GOOS=windows GOARCH=386 go build -o hello.exe hello.go
hello.exe
を実行するために Windows コンピューターを見つける必要があります。
このコンテンツは、Go Wiki の一部です。