LoginSignup
13
10

More than 5 years have passed since last update.

cgoを使ってGoでC言語の自作ライブラリを呼ぶ

Posted at

自分で書いたC言語ライブラリをcgoでGoで利用する。

C言語ライブラリ作成

ライブラリ化するプログラムはhello.chello.hがそのヘッダファイル。main.cはそのライブラリを使用するプログラム。

hello.c
#include <stdio.h>
#include "hello.h"

void hello(void)
{
    printf("Hello, World!\n");
}
hello.h
extern void hello(void);
main.c
#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で使用するための機能。

main.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!
13
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
10