sago35 / tinygobook

Support site for book (基礎から学ぶ TinyGoの組込み開発) released in Japan
https://www.c-r.com/book/detail/1477
MIT License
13 stars 1 forks source link

C言語からGoの関数を呼び出す時のコンパイルの仕方について #7

Closed m1goh closed 1 year ago

m1goh commented 1 year ago

C言語からGoの関数を呼び出してみたかったので P.96とP.97のサンプルを入力してmain.cをgccでコンパイルすると

akiyoshi@LAPTOP-JPBE28JN:~/tinygobook/chapter031004$ gcc main.c /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o: in function _start': (.text+0x24): undefined reference tomain' /usr/bin/ld: /tmp/ccQeVZ4a.o: in function CPrint': main.c:(.text+0x1a): undefined reference togoPrint' collect2: error: ld returned 1 exit status akiyoshi@LAPTOP-JPBE28JN:~/tinygobook/chapter031004$

このようにエラーになりました。

インターネットでC言語からGo言語の関数を呼ぶ方法というのを見付けました。 https://blog.takuchalle.dev/post/2020/05/14/call_go_function_from_c/ こちらによると、Goでコンパイルしてから、gccでコンパイルしているようです。

P.96のmain.goとP.97のmain.cをコンパイルして実行する、コンパイルの仕方を教えていただけないでしょうか? よろしくお願いします。

sago35 commented 1 year ago

以下のように同じフォルダに main.go と main.c を配置して go build を行うと同時にビルドされます。 C ソースを別でビルドする必要はないです。

$ ls
go.mod  main.c  main.go

$ go build                                                                                                                                               

あるいは go run . でも実行出来ます。 . が必要なので注意してください。

$ go run .
hello from cPrint
hello from goPrint

上のリンクで紹介されている方法は、 -buildmode=c-archive でアーカイブを作ってから、 gcc でリンクするやり方となっていて、例えば Windows ではサポートされていません。 (今もサポートされていないはず)

m1goh commented 1 year ago

教えていただいた方法で実行できました。面白かったです、ありがとうございました。