「C 言語から GO 言語の関数を呼ぶ方法」のコンパイルに失敗する件
C 言語から GO 言語の関数を呼ぶ方法
を参考にさせて頂いて、実験中です。
大変申し訳ありませんが、ほぼ丸パクりさせて下さい。これから、頻繁に見る必要があり、万一ページがexpiredされたら青冷めますので。
hoge.go
というファイル名のPrintHoge
関数を C 言語から呼べるようにします。
C
をインポートする- C 言語から呼びたい関数に
//export XXXX
を書く (普通、//とするとコメントなんだけどなぁ) - コンパイルする
package main
import (
"C"
"fmt"
)
//export PrintHoge
func PrintHoge() {
fmt.Println("hoge")
}
func main() {}
main
関数がないとエラーになるので、空で良いので書いておきます。
-buildmode=c-archive
オプションをつけてgo build
します。
$ go build -buildmode=c-archive hoge.go
すると、hoge.a
アーカイブとhoge.h
ヘッダが生成されます。
生成されたヘッダをインクルードして、Go 言語の関数を呼びます。
生成されたアーカイブと一緒にコンパイルします。
$ gcc -o hoge hoge.a main.c
ところが、
$ gcc -o hoge hoge.a main.c
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w6
4-mingw32/bin/ld.exe: C:\Users\ebata\AppData\Local\Temp\cc1F3Mbe.o:main.c:(.text
+0xe): undefined reference to `PrintHoge'
collect2.exe: error: ld returned 1 exit status
が出てきて、「変だなー」と思いつつ、色々調べてみたのですが、hoge.aを一番最後にしたら、動きました。
$ gcc -o hoge main.c hoge.a$ ./hogehoge
以上