「C 言語から GO 言語の関数を呼ぶ方法」のコンパイルに失敗する件

C 言語から GO 言語の関数を呼ぶ方法

を参考にさせて頂いて、実験中です。

大変申し訳ありませんが、ほぼ丸パクりさせて下さい。これから、頻繁に見る必要があり、万一ページがexpiredされたら青冷めますので。

hoge.goというファイル名のPrintHoge関数を C 言語から呼べるようにします。

  1. Cをインポートする
  2. C 言語から呼びたい関数に//export XXXXを書く (普通、//とするとコメントなんだけどなぁ)
  3. コンパイルする
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 言語の関数を呼びます。

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

int main() {
    PrintHoge();
    return 0;    
}

生成されたアーカイブと一緒にコンパイルします。

$ 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
$ ./hoge
hoge
以上

2021/03,江端さんの技術メモ

Posted by ebata