EmscriptenでWebAssemblyを作る
EmscriptenでWebAssemblyを作る
要素
--js-libraryhttps://emscripten.org/docs/tools_reference/emcc.html#emcc-js-library
WebAssembly.importObjectsに渡す函数を指定する
次のようなコードで指定し、そのコードファイルパスを引数に与える
code:js
mergeInto(LibraryManager.library, {
func1,func2,// ...
});
Emscripten で C/C++ から JS の関数を呼ぶには #JavaScript - Qiita
--pre-jshttps://emscripten.org/docs/tools_reference/emcc.html#emcc-pre-js
wasm moduleの初期化コードの(おそらく)末尾に指定したJSファイルを差し込めるoption
解決方法 | 1年間本番環境で WebAssembly ( by Emscripten )を使ってきた中で生じた問題とその解決策 #JavaScript - Qiita
Emscripten Compiler Frontend (emcc) — Emscripten 3.1.54-git (dev) documentationにoptionsの説明がある
既存のコードをwasmにする
既存の C モジュールから WebAssembly へのコンパイル - WebAssembly | MDN
わかりやすい
Rust版はなさそう
C/C++ から WebAssembly へのコンパイル - WebAssembly | MDN
emccはem++でもいい
$ em++ hello.cpp -o hello.html
実行可能なhtmlが生成される
事前にスタイルなども設定されているデモ用のやつ
hello.html,hello.js,hellow.wasmができる
hellow.htmlを開くとhellow.cppのmainが実行される
$ em++ hello.cpp -o hello.js
jsとwasmだけ作る
$ em++ hello.cpp -o hello.mjs
ES6形式のjsとwasmを作る
Rust から WebAssembly にコンパイル - WebAssembly | MDN
WebAssemblyとEmscriptenに入門した | フューチャー技術ブログ
ccallとcwrap
型定義ファイルの生成
Embind以外で使うとエラーになる
https://qiita.com/chikoski/items/462b34db61daf13a7897#embind-を使う方法
-lembindをつける
--embind-emit-tsdで指定する
$ em++ cpp/lib.cpp -lembind -o cpp/dist/lib.mjs --embind-emit-tsd lib.d.ts
型定義ファイルは-oで指定したパスと同じdirectoryに出力される
引数でpointerを使うとエラーが出る
$ Implicitly binding raw pointers is illegal. Specify allow_raw_pointer<arg<?>>
typescript-definitions | Embind — Emscripten 3.1.53-git (dev) documentation
https://github.com/emscripten-core/emscripten/issues/10271
色々提案されてる?
情報量多め
Devcontainer features
https://github.com/ebaskoro/devcontainer-features/tree/main/src/emscripten
code:json
"features": {
"ghcr.io/ebaskoro/devcontainer-features/emscripten:1": {}
}
#2024-08-05 23:29:43
#2024-02-08 16:04:45
#2024-01-30 12:44:12