Go言語でクロスコンパイルする
これを試したときのバージョン: go version go1.0.1
実行環境:Mac OS X Lion
下準備
Goはソースからコンパイルしておきます。これを参考に:http://golang.org/doc/install/source
$ hg clone -u release https://code.google.com/p/go $ cd go/src $ ./all.bash
としてインストールしておきます。
まずは、以下の hello.go を普通にコンパイルしてみます:
package main import "fmt" func main() { fmt.Println("Hello, 世界") }
を
$ go build hello.go $ file hello
とすると
hello: Mach-O 64-bit executable x86_64
となってますね。Mac上での実行ファイル形式です。
本題
それではクロスコンパイルの準備です。
$ cd go/src $ GOOS=linux GOARCH=amd64 ./make.bash
これだけです!
先程の hello.go のコンパイルは、
$ GOOS=linux GOARCH=amd64 go build hello.go
として、環境変数をgoコマンドへ渡してコンパイルします。
それでは、同じようにファイルを調べてみましょう。
$ file hello hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped
希望通りLinux上で動く実行ファイルが出来てます!
そのほか、 Linux ARM 向けにもコンパイルできます。そのあたりの GOOS と GOARCH の組み合わせは、こちら http://golang.org/doc/install/source#environment を参考にしてみてください。
おわり。
雑記メモ
クロスコンパイル環境が整っていないと、次のようなエラーがでる:
$ GOOS=linux GOARCH=amd64 go build
とすると:
# runtime /Users/xxx/go/src/pkg/runtime/extern.go:135: undefined: theGoos /Users/xxx/go/src/pkg/runtime/extern.go:135: cannot use theGoos as type string in const initializer
というエラーがでたよというメモ。