WebAssembly LinkError module =“env”

时间:2017-03-08 10:24:25

标签: javascript webassembly

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

在我的index.html中关注these instructions

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, {}))

但是我收到了这个错误:

RangeError

所以我尝试使用MDN docs中的WebAssembly.instantiate()代码:

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

我得到另一个:

LinkError

知道怎么解决吗?

2 个答案:

答案 0 :(得分:3)

您的问题并不清楚,但进一步的评论解释说您将导入对象保留为{},导致实例化失败。 WebAssembly使用双重命名空间,import object满足WebAssembly.Module的{​​{3}}。每个导入都是imports作为模块+字段+种类,JavaScript导入对象必须满足。

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

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

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

这是我之前提到的双重命名空间:env是一个模块,foo / bar是字段。他们的类型是function。 WebAssembly支持其他类型的导入和导出:table,memory和global。

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

答案 1 :(得分:1)

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