Go言語はクロスコンパイルができると聞いていたものの、どうやるのか?実際に動くの?という疑問があったので試してみました。結論として、指定するパラメータの値を知りさえすれば、簡単にコンパイルし実行できます。この記事では、実際に1件だけ違うアーキテクチャでの実行(コンパイル[darwin,amd64]->実行[windows,386])を紹介します。
手順
- Mac High Sierra(64bits)とWindows 7(32bits)を用意
- Macでサンプルプログラムを作成
- Macでクロスコンパイル実行(一番大事)
- Windowsでプログラムを実行
サンプルプログラム
A Tour of 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ツールを作成し配布できそうで好感触でした。
