C 言語から Go 言語を呼び出す方法
C言語は、実行時環境やABI(Application Binary Interface)が異なるため、ネイティブな形でGo言語を直接呼び出すことはできません。ただし、Cgoを使用してC言語からGo言語の関数を呼び出すことができます。
Go言語関数をC言語で呼び出す方法を簡単に示す例
はじめに、Go言語のソースファイル(例:test.go)を作成します。
package main
import "C"
//export hello
func hello() {
println("Hello from Go!")
}
func main() {
// main函数留空
}
次に、goコマンドを使用して静的ライブラリファイルにコンパイルします:
go build -buildmode=c-archive -o test.a test.go
コンパイル後、C言語の静的ライブラリファイル(test.a)が生成されます。
C语言でソースファイル(例えばmain.c)を作成する
#include "test.h"
int main() {
hello(); // 调用Go函数
return 0;
}
Go の静的にリンクされたライブラリファイル(test.h)のヘッダーをインクルードし、main 関数で Go 関数 hello() を呼び出します。
最後に、gccでC言語のソースファイルとGo静的ライブラリファイルをコンパイルしてリンクします。
gcc -o main main.c test.a
ビルドが上手く行くと、コンパイルによって生成された実行可能ファイル(main)で、「Hello from Go!」が出力されたかどうかをコンソールで確認できます。
CGO_ENABLED環境変数が設定されていない場合、Goコードのコンパイル時に”-x” オプションを付けてコンパイルコマンドの出力詳細を確認することで、CGO_ENABLEDが1になっていることを確認できます。1になっていない場合は、環境変数を設定することでCgo機能を有効化できます。
export CGO_ENABLED=1
なお、C 言語のインターフェイスファイルを生成するために swig ツールを用いることもでき、より容易に C と Go の相互運用を実現できます。