go1.5のshared library機能を使ってみた

概要

go 1.5からshared library作成用ビルドモードが追加された。

shared libraryを作成する方法と、アーカイブを作成する方法がある。

Golang で Shared Library を出力する。 - Qiita
上記リンクのサンプルコード(libgofib.go)を使ってshared library、アーカイブを作成してみた。環境は、Mac OS X 10.10.4(Yosemite)。

mobile環境(android/iOS)で使えるようにするのがゴールだと思うが、組込環境全般でも使えそうな気がする。

shared library

以下のコマンドでビルドする。

$ go build -buildmode=c-shared -o libgofib.so libgofib.go

ヘッダ(libgofib.h)とモジュール(libgofib.so)が出力される。

リンク先と同様にpythonでロードした。便利だなぁ。

$ cat libfib.h
...
#ifdef __cplusplus
extern "C" {
#endif

extern GoInt fib(GoInt p0);

#ifdef __cplusplus
}
#endif
...
$ nm libgofib.so| grep fib
00000000000023e0 T __cgoexp_3d7d0474531e_fib
0000000000001e60 T _fib
0000000000002420 t main.fib
000000000013b8e8 s main.fib.f

archive library

アーカイブライブはビルドモードを変えるだけで作成できる。

$ go build -buildmode=c-archive libgofib.go

ヘッダ(libfib.h)とモジュール(libgofib.a)が出力される。ヘッダはshared library版と同じ。

$ nm libgofib.a | grep fib
libgofib.a(000000.o):
                 U __cgoexp_3d7d0474531e_fib
0000000000000000 T _fib
libgofib.a(000001.o):
libgofib.a(go.o):
0000000000002040 T __cgoexp_3d7d0474531e_fib
0000000000002080 t main.fib
0000000000138f28 s main.fib.f

mainファイルを作成して実行した。

$ cat main.c
#include 
#include "libgofib.h"

int main(int argc, char *argv[]) {
    printf("fib(32) = %lld\n", fib(32));
}
$ gcc main.c -I. -o main libgofib.a
$ ./main
2015/07/29 06:15:12 Loaded!!
fib(32) = 2178309

関連情報