memoメモ

最近はGo言語関連で。φ(..)メモメモ

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

というエラーがでたよというメモ。