自分で書いたC言語ライブラリをcgoでGoで利用する。
C言語ライブラリ作成
ライブラリ化するプログラムはhello.c
でhello.h
がそのヘッダファイル。main.c
はそのライブラリを使用するプログラム。
#include <stdio.h>
#include "hello.h"
void hello(void)
{
printf("Hello, World!\n");
}
extern void hello(void);
#include <stdlib.h>
#include "hello.h"
int main(int argc, char *argv[])
{
hello();
return EXIT_SUCCESS;
}
$ gcc -c hello.c
$ ar rusv libhello.a hello.o
$ gcc -o main main.c -L. -lhello
$ ./main
Hello, World!
Goで自作ライブラリを使用する
下記のようなmain.go
というプログラムを用意した。cgoはGoに標準で用意されているC言語プログラムをGoで使用するための機能。
package main
/*
#cgo LDFLAGS: -L. -lhello
#include <hello.h>
*/
import "C"
func main() {
C.hello()
}
import "C"
が必要なパッケージのインポート。そのすぐ上に書いてあるコメントアウトがC言語を利用するためのコード。
/*
#cgo LDFLAGS: -L. -lhello
#include <hello.h>
*/
ここにはC言語をそのまま記述することができて、ここで定義した関数をGoのコード上で利用できる。LDFLAGS
でコンパイル時に使用するC言語ライブラリの情報を与える、これは前章の$ gcc -o main main.c -L. -lhello
で指定した2つの引数と同じ意味。-L
がライブラリの場所を指定するオプション。ライブラリは前章で作成したlibhello.a
で同じディレクトリ配下にあるので.
だけ指定する。-l
は使用するライブラリを指定する、指定の仕方はlib
を除いたライブラリ名、つまりlibhello
からlib
を除いたhello
を指定する。あとはhello.h
をインクルードしてhello()
関数を呼び出せるようにする。
実行結果は下記の通り。
$ go run main.go
Hello, World!