我正在閱讀一本關於 WebAssembly 的好書,我正在嘗試學習如何在不使用「膠水代碼」的情況下將 JS 函數導入 wasm
。
這是 C 文件,其中宣告了 2 個 extern
函數
extern int jsClearRect(); extern int jsFillRect();
然後,我使用以下說明將 c
程式碼編譯為 wasm
:
emcc src/main.c -Os -s STANDALONE_WASM=1 -s SIDE_MODULE=1 -o main.wasm
然後我被指示編寫一個JS腳本,其中instantiate
wasm文件,定義jsFillRect()
和jsClearRect()
並使用導入物件將它們導入到模組的env
中。
// define the import Objects const importObj = { "env": { "__memory_base":0, "tableBase":0, "memory": new WebAssembly.Memory({ initial: 256 }), "table": new WebAssembly.Table({ initial: 8, element: 'anyfunc' }), jsClearRect(): function() {/*function definition here*/}, jsFillRect(): function() {/*function definition here*/}, } } // import the module fetch('main.wasm') .then(obj => WebAssembly.instantiateStreaming(obj,importObject)) .then(result => console.log(result)) .catch(err => console.log(err))
我收到一個錯誤:
TypeError: import object field 'GOT.mem' is not an Object
我在這裡展示的導入物件已經是原始物件的修改版本(您可以在此處找到)。在此範例中,函數在 JS 中宣告為 _jsClearRect()
,但模組找不到 jsClearRect()
的定義。然後它找不到__memory_base
的定義,因為它被聲明為memoryBase
但現在我不知道Object
的國王代表GOT.mem
。
我環顧四周,感覺我正在使用舊的 API,但我找不到合適的解決方案來實現這一點。
所以我的問題是:
如何將 Javascript 函數匯入到 wasm 模組中?
P粉2768766632024-03-30 09:04:48
GOT.mem
來自 emscripten 使用的動態連結 ABI。在這種情況下,我認為您不需要動態連結內容,您可以/應該刪除 -sSIDE_MODULE
。
這應該會簡化/減少您需要提供的導入。 (例如,您不需要提供 table
或 memory
)。