4

所以我正在尝试从 ArrayBuffer 创建一个 WebAssembly 模块。

C代码:

#include <stdio.h>

int main() {
      printf("hello, world!\n");
        return 0;
}

我像这样编译它:

$ emcc -O2 hello.c -s WASM=1 -o hello.html

我启动了一个本地 http 服务器。我尝试像这样在我的浏览器中加载它:

fetch('hello.wasm')
.then(res => res.arrayBuffer())
.then(buff => WebAssembly.Module(buff));

我收到以下错误:

Uncaught (in promise) RangeError: WebAssembly.Module(): Wasm 编译在此上下文中超出了 fetch.then.then.buff (:1:77) 处提供的参数的内部限制

我不知道如何解决这个错误,也无法通过网络搜索找到任何东西。

任何帮助表示赞赏

谢谢!

4

1 回答 1

2

WebAssembly.Module是同步的,一些浏览器不允许主线程上的大模块以避免编译阻塞主线程。

试试这个:

fetch('hello.wasm').then(response =>
    response.arrayBuffer()
).then(buffer =>
    WebAssembly.instantiate(buffer, importObj)
).then(({module, instance}) =>
    instance.exports.f()
);

最好使用WebAssembly.instantiate它,因为它同时进行编译和实例化,并允许引擎保持在importObject以确保事情看起来不错(尤其是WebAssembly.Memory)。

在这里,我假设您想要更多main,而是想要调用模块的导出函数f

于 2017-06-12T20:04:26.413 回答