2

我正在webassembly.org上运行教程,现在我想hello.wasm从我自己的页面运行。我正在按照教程的说明使用Emscripten编译代码。

按照我正在做的这些说明index.html

const instantiate = (bytes, imports = {}) =>
  WebAssembly.compile(bytes).then(m =>
    new WebAssembly.Instance(m, imports)
  )

fetch('hello.wasm')
  .then(response => response.arrayBuffer())
  .then(bytes => instantiate(bytes, {}))

但我得到这个错误:

范围错误

所以我尝试WebAssembly.instantiate()MDN 文档中使用以下代码:

const instantiate = (bytes, imports = {}) =>
  WebAssembly.compile(bytes).then(m =>
    WebAssembly.instantiate(m, imports)
  )

我得到一个不同的:

链接错误

知道如何解决吗?

4

2 回答 2

3

您的问题尚不清楚,但进一步的评论说明您将导入对象保留为{},导致实例化失败。WebAssembly 使用双重命名空间,其中import 对象实现了importsWebAssembly.Module。每个导入都指定为模块+字段+种类,JavaScript 导入对象必须满足。

Emscripten 已经生成hello.wasm了为您加载的 HTML+JS,包括 WebAssembly 导入对象。Emscripten 生成的内容非常大,因为它模拟了操作系统。导入对象提供所有系统调用(对 JavaScript)。您必须将这些传递给示例才能工作......或者只使用 Emscripten 已经生成的那些。

您正在使用的代码需要一个名为env. Emscripten 包含以下代码:

let importObject = {
  env: { foo: () => 42, bar: () => 3.14 }
};

这就是我前面提到的双重命名空间:env是模块,foo/bar是字段。他们的类型是function。WebAssembly 支持其他类型的导入和导出:表、内存和全局。

缺少单个模块或模块的字段,或类型不匹配,会导致实例化失败。

于 2017-03-09T11:25:10.480 回答
1

显然,您的示例模块想要从名为"env". 但是,imports您提供的对象是空的。要使模块的实例化成功,您需要提供表单的导入对象{env: {...}},其中的点是对应于每个导入的属性"env"

于 2017-03-08T11:34:14.533 回答