【问题标题】:WebAssembly LinkError module="env"WebAssembly LinkError 模块="env"
【发布时间】:2017-03-08 10:24:24
【问题描述】:

我正在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)
  )

我得到一个不同的:

知道怎么解决吗?

【问题讨论】:

  • 让我们尝试缩小问题范围:在第二个示例中您不需要compile,只需要instantiate:它需要.wasm 字节并编译+实例化它们。 imports 对象是什么?还是您将其保留为默认{}?您的模块声明的导入是什么(我假设来自 Emscripten)?
  • 即使我使用instantiate的重载方法,它也会失败并出现同样的错误。我将一个空对象作为imports 传递给它,但我不知道所需的依赖项。
  • Emscripten 已经生成了 HTML+JS,它会为您加载 hello.wasm,包括 WebAssembly 导入对象。 Emscripten 生成的内容非常大,因为它模拟了操作系统。导入对象基本上提供所有系统调用(对 JavaScript)。您必须将这些传递给示例才能工作......或者只使用 Emscripten 已经生成的那些。
  • 我认为你的评论和@Andreas 的答案应该是正确的答案。
  • 太好了,我回答了额外的信息!

标签: javascript webassembly


【解决方案1】:

您的问题并不清楚,但进一步的 cmets 解释说您将导入对象保留为 {},导致实例化失败。 WebAssembly 使用双重命名空间,其中import object 满足WebAssembly.Moduleimports。每个导入都是 specified 为模块+字段+种类,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 支持其他类型的导入和导出:表、内存和全局。

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

【讨论】:

  • @Bastien,WASM 模块可以调用 impoerObject.env 中定义的函数吗?如果可能的话怎么做?
【解决方案2】:

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

【讨论】:

  • 是的,我也这么认为。但是我怎样才能得到这些依赖呢?现在我正在尝试反编译 wasm 并查看 import 语句是什么。
  • 我更新了我的问题,直接引用了教程中的 Emscripten。虽然你的回答基本上是正确的,但我认为应该用 JF Bastien 的评论来完成,这更具体,对以后的参考很有用。
猜你喜欢
  • 1970-01-01
  • 2017-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-25
  • 1970-01-01
  • 2022-09-28
  • 2022-12-16
相关资源
最近更新 更多