extern "C"と直接書いてはならない
MRB_BEGIN_DECL
と
MRB_END_DECL
で囲む。
なんでか?
2016年の11月以降から、デフォルトだと
C++を使うmrbgemを組み込んだmrubyは.cファイルもC++としてコンパイルされることに
なったから。
この状態では、
extern "C"
と記述してしまうと、C++としてコンパイルされた.cファイルからリンクできずにエラーとなる。
デフォルトだと多くのCのコードでエラー
Cのコードとしては問題ないコードでも、C++としてはコンパイルすると
エラーとなることが多々ある。
例えば
C++では、void *への変換は暗黙にできるが、void *から他の型への変換は、明示的なキャストが必要
で結構引っかかった。
/home/junichi/work/mruby/mruby-webcam/mruby/build/mrbgems/mruby-socket/src/socket.c: In function ‘mrb_value mrb_addrinfo_getaddrinfo(mrb_state*, mrb_value)’:
/home/junichi/work/mruby/mruby-webcam/mruby/include/mruby/boxing_no.h:25:35: error: invalid conversion from ‘void*’ to ‘addrinfo*’ [-fpermissive]
#define mrb_ptr(o) (o).value.p
じゃぁ、これまでとおりにCをCとしてビルドするには
build_config.rbの前の方に
conf.disable_cxx_exception
ただし、これを入れるとC++を使ったモジュールで-lc++なり、C++の標準ライブラリの
明示的なリンクが必要。