WebAssembly LinkError 模块="env"

WebAssembly LinkError module="env"

我正在 运行 在 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, {}))

但是我得到这个错误:

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

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

我得到了一个不同的:

知道如何解决吗?

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

进行的每个导入的属性

您的问题并不清楚,但进一步的评论解释说您将导入对象保留为 {},导致实例化失败。 WebAssembly 使用双命名空间,其中 import object fulfills the WebAssembly.Module's imports. Each import is specified 作为模块+字段+种类,JavaScript 导入对象必须满足。

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

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

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

也就是前面提到的double namespace:env是模块,foo / bar是字段。他们的类型是function。 WebAssembly 支持其他类型的导入和导出:table、内存和全局。

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