2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

最近のmrubyでC++を使ったmrbgemを作る時の注意事項的な何か

Posted at

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++の標準ライブラリの
明示的なリンクが必要。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?