C++を使えるようにする(libcxxabiのコンパイル)

メモし忘れていたので、追加です。Clang で WebAssembly をコンパイルする際、C++ を使えるよう、libcxxabi を追加します。これも、Emscripten から拝借してコンパイルするだけです。


コンパイル

C++ で仮想関数周りも使えるように、libcxxabi をコンパイルします。「system/lib」にコンパイル用の MakeFile を追加します(以下のような感じ)。

ポイントは、libcxx も含めること、デバッグシンボルとして「-D_LIBCPP_HAS_NO_THREADS -DLIBCXX_BUILDING_LIBCXXABI -DHAS_THREAD_LOCAL」を追加しておくとです。当然「--target=wasm32」も忘れずに。

また、libcxxabi から「Unwind_AppleExtras.cpp」を除外しておきます。

これでできた「libcxxabi.a」をリンクすれば、純粋仮想関数やダイナミックキャストが C++ で使えるようになります。

例外は非対応

このライブラリを追加すると、以下の関数が足りません。

  • _Unwind_RaiseException
  • _Unwind_DeleteException

この辺は、例外の発生等で必要な関数のようです。ただ、現在の WebAssembly の仕様ですと、この辺の実装ができません。そのため、空の関数として JavaScript 側に用意しておき、例外を使用してしまった場合は、エラーを出すようにするしなないと思います。

WebAssembly にも例外の命令が追加されそう(まだ proposal)なので、それ待ちです。

まとめ

これで、WebAssembly へのコンパイルに C++ を使えるようになりました。今回使用したライブラリは Emscripten 1.38.28 に入っていた libcxxabi でした。色々と試してみたところ、無名関数も使えました。

今回作ったもので、目標の bullet もコンパイルはできました(動作確認はできていません)。幸い、例外を使っていなかったようなので、セーフです。