Go言語はクロスコンパイルができると聞いていたものの、どうやるのか?実際に動くの?という疑問があったので試してみました。結論として、指定するパラメータの値を知りさえすれば、簡単にコンパイルし実行できます。この記事では、実際に1件だけ違うアーキテクチャでの実行(コンパイル[darwin,amd64]->実行[windows,386])を紹介します。
手順
- Mac High Sierra(64bits)とWindows 7(32bits)を用意
- Macでサンプルプログラムを作成
- Macでクロスコンパイル実行(一番大事)
- Windowsでプログラムを実行
サンプルプログラム
A Tour of Goから、以下の並列処理プログラムを借りました。
main.go
package main
import (
"fmt"
"time"
)
func say(s string) {
for i := 0; i < 5; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func main() {
go say("world")
say("hello")
}
クロスコンパイル
ターゲットのアーキテクチャに合わせて、$GOOS
と$GOARCH
を設定します。設定値は何にすればいいのか?ですが、公式HPで丁寧に説明されています。今回は、ターゲットがWindows 7(32bits)なので、下から2番目の[windows,386]です。
$GOOS | $GOARCH |
---|---|
android | arm |
darwin | 386 |
darwin | amd64 |
darwin | arm |
darwin | arm64 |
dragonfly | amd64 |
freebsd | 386 |
freebsd | amd64 |
freebsd | arm |
linux | 386 |
linux | amd64 |
linux | arm |
linux | arm64 |
linux | ppc64 |
linux | ppc64le |
linux | mips |
linux | mipsle |
linux | mips64 |
linux | mips64le |
linux | s390x |
netbsd | 386 |
netbsd | amd64 |
netbsd | arm |
openbsd | 386 |
openbsd | amd64 |
openbsd | arm |
plan9 | 386 |
plan9 | amd64 |
solaris | amd64 |
windows |
386 |
windows | amd64 |
以下のようにコンパイルします。簡単です。
$ GOOS=windows GOARCH=386 go build main.go
完了するとmain.exe
というWindowsの実行ファイルらしきものができます。
Windowsで実行
この実行ファイルをWindowsへコピーします。次に、コマンドプロンプトを立ち上げ、実行してみます。問題なく実行できました。
感想
実行するアーキテクチャを気にすることなく、CUIツールを作成し配布できそうで好感触でした。