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