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 もコンパイルはできました(動作確認はできていません)。幸い、例外を使っていなかったようなので、セーフです。