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-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

Go コマンドとパッケージの Windows/386 バージョンをビルドするために。私のスクリプトから、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の一部です。