シンプルな自己完結型のC++ファイル(math.cpp
) このような:
int add(int x, int y) {
return x + y;
}
WebAssemblyにどのようにコンパイルしますか(math.wasm
)?
注:Clangツールチェーンを使用しています。
this Gist が非常に役立つことがわかりました。
基本的に、これはステップです:
-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly
)Clangで.cppソースをllvmビットコードにコンパイルします。
clang -emit-llvm --target=wasm32 -Oz math.cpp -c -o math.bc
ビットコードをs-Assemblyにコンパイルします。
llc -asm-verbose=false -o math.s math.bc
binaryen のs2wasmツールを使用して.wastファイルを作成します
s2wasm math.s > math.wast
[〜#〜] 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
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
2019年現在、Clang(8)はそのままWebアセンブリをサポートしています。これは、単純な.wasmファイルのコンパイル、リンク、および実行に必要なすべてを含むリポジトリです。
現在、CおよびC++をコンパイルする最も簡単な方法は emscripten を使用することです。言及するコンポーネントはすべてコンポーネントですが、emscriptenはエンドツーエンドのビルドをサポートする完全なツールチェーンであり、libc/libc ++やその他のさまざまな有用なライブラリなど、必要なすべてのパーツが含まれています。 asm.jsとwasmの両方のターゲティングをサポートしています。
この回答には少し遅れましたが、スクリプトをコンパイルするためのオンラインの美しいツールがあります。
例として、私はこれを使用しています。 (C、C++、std99 ...)をコンパイルするための最小限のオプションを提供するものですが、十分です: https://wasdk.github.io/WasmFiddle/
また、使用方法に応じて、x86、コードバッファーなどの異なる言語から選択できます。また、コードを共有することもできます。他のバディと一緒に作業しているときにクールだと思う機能の種類: https://wasdk.github.io/WasmFiddle/?gus9d :)
このスレッドの回答に基づいて、少し guide を作成しました。
私にとって最も簡単な方法は、 emscripten (ウェブサイトも素晴らしい出発点です!)をコンパイルし、コードをwasmにコンパイルし、適切なバインディングを生成し、ラッパーでこれをすべて隠すことですJS側にすれば、素敵なインターフェイスが表示されます。
C++の名前のマングリングのために、Cを使い始めるのが簡単であることがわかりました。