web-dev-qa-db-ja.com

C ++ファイルをWebAssemblyにコンパイルするにはどうすればよいですか?

シンプルな自己完結型のC++ファイル(math.cpp) このような:

int add(int x, int y) {
  return x + y;
}

WebAssemblyにどのようにコンパイルしますか(math.wasm)?

注:Clangツールチェーンを使用しています。

30
sdgfsdh

this Gist が非常に役立つことがわかりました。

基本的に、これはステップです:

  1. (ビルドllvmおよびclang 5.0.0以上で-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly
  2. Clangで.cppソースをllvmビットコードにコンパイルします。

    clang -emit-llvm --target=wasm32 -Oz math.cpp -c -o math.bc

  3. ビットコードをs-Assemblyにコンパイルします。

    llc -asm-verbose=false -o math.s math.bc

  4. binaryen のs2wasmツールを使用して.wastファイルを作成します

    s2wasm math.s > math.wast

  5. [〜#〜] wabt [〜#〜] のwast2wasmツールを使用して、テキストの.wastファイルをバイナリの.wasmに変換します。

    wast2wasm -o math.wasm math.wast

一部の手順は冗長に感じますが、ショートカットを許可するツールはまだ見つかりません。 (llcが.wasmに直接コンパイルできる場合、または名前が示すようにs2wasmが実際にバイナリの.wasmファイルを作成した場合は、素晴らしいでしょう。)とにかく、ツールチェーンを実行しても比較的痛みはありません。ただし、Web Assembly用のCまたはC++標準ライブラリはまだないことに注意してください。

また、物を試すためだけに.wasmファイルが必要な場合は、すべてのツールチェーンのトラブルなしで逃げることができます。 https://mbebenita.github.io/WasmExplorer/C/C++コードに貼り付ける を参照し、コンパイルされた.wasmファイルをダウンロードします。


@noontzと@ LB--それを指摘してくれてありがとう

実際、Gistのコメントが示すように、binaryenをスキップして、Clang/LLVMからwasmに直接コンパイルできます。現在、C++で次のコマンドラインを使用しています。

clang++ test.cpp -ObjC++ --compile --target=wasm32-unknown-unknown-wasm \ 
        --optimize=3 --output test.wasm
26
kazemakase

Emscripten には、C++ファイルをwasmにコンパイルするために必要なものがすべて付属しています。 Emscriptenには [〜#〜] sdk [〜#〜] もあり、必要なツールをすべてインストールする際に簡単に作業できます。

ただし、デフォルトでは、Emscriptenは一部のフレームワークコードをwasmファイルに追加し、いくつかのhtmlおよびjavascriptを生成します。

フレームワークコード、javascript、またはhtmlを含まないEmscriptenを使用して、最小限のwasmファイルを作成することができます。オプション-s SIDE_MODULE=1 -Oz -s ONLY_MY_CODE=1を使用してemccまたはem++でコンパイルすると、最小限のwasmファイルが得られます。

次のコマンドは、例とEmscriptenを使用して最小限のwasmファイルをエクスポートします。

em++ math.cpp -o math.wasm -Oz -s SIDE_MODULE=1 -s WASM=1 -s "EXPORTED_FUNCTIONS=['_add']" -s ONLY_MY_CODE=1

6
Clint

2019年現在、Clang(8)はそのままWebアセンブリをサポートしています。これは、単純な.wasmファイルのコンパイル、リンク、および実行に必要なすべてを含むリポジトリです。

https://github.com/PetterS/clang-wasm

4
Petter

現在、CおよびC++をコンパイルする最も簡単な方法は emscripten を使用することです。言及するコンポーネントはすべてコンポーネントですが、emscriptenはエンドツーエンドのビルドをサポートする完全なツールチェーンであり、libc/libc ++やその他のさまざまな有用なライブラリなど、必要なすべてのパーツが含まれています。 asm.jsとwasmの両方​​のターゲティングをサポートしています。

2
Derek

この回答には少し遅れましたが、スクリプトをコンパイルするためのオンラインの美しいツールがあります。

例として、私はこれを使用しています。 (C、C++、std99 ...)をコンパイルするための最小限のオプションを提供するものですが、十分です: https://wasdk.github.io/WasmFiddle/

また、使用方法に応じて、x86、コードバッファーなどの異なる言語から選択できます。また、コードを共有することもできます。他のバディと一緒に作業しているときにクールだと思う機能の種類: https://wasdk.github.io/WasmFiddle/?gus9d :)

1
Latsuj

このスレッドの回答に基づいて、少し guide を作成しました。

私にとって最も簡単な方法は、 emscripten (ウェブサイトも素晴らしい出発点です!)をコンパイルし、コードをwasmにコンパイルし、適切なバインディングを生成し、ラッパーでこれをすべて隠すことですJS側にすれば、素敵なインターフェイスが表示されます。

C++の名前のマングリングのために、Cを使い始めるのが簡単であることがわかりました。

1
Thomas Deniffel