Go Wiki: Linux で Windows 用 Go プログラムをビルドする

利用可能な GOOSGOARCH の値については、こちら を参照してください。

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-archivec-sharedsharedplugin を使用するには、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 の一部です。