手順整理

  1. Cでロジックを書く
  2. Cのソースをスタティックライブラリにコンパイルする
  3. goでコールする

当たり前みたいに簡単笑

1. Cでロジックを書く

ヘッダー:

// helloLib/hello.h

#ifndef HELLO_H
#define HELLO_H

void hello(const char* name);

#endif

実装:

// helloLib/hello.c

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

void hello(const char* name) {
    printf("Hello from %s\n", name);
}

2. Cのソースをスタティックライブラリにコンパイルする

gcc -c helloLib/*.c
ar rs helloLib.a *.o
rm helloLib.o

3. goでコールする

package main

// #cgo CFLAGS: -I${SRCDIR}/helloLib
// #cgo LDFLAGS: ${SRCDIR}/helloLib.a
// #include <stdlib.h>
// #include <hello.h>
import "C"

// ↑goでCを使う時に基本的に
//「コメントアウトしたCコードの直後にimport "C"」
// という感じで書く

import "unsafe"

func main() {
    name := C.CString("Go World")      // CパッケージのCString関数でC用の文字列変数を作成
    defer C.free(unsafe.Pointer(name)) // 終了時ポインターちゃんと解放されるように
    C.hello(name)
}