首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WebAssembly LinkError module="env“

WebAssembly LinkError module="env“
EN

Stack Overflow用户
提问于 2017-03-08 10:24:24
回答 2查看 4.7K关注 0票数 4

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

在我的index.html中遵循index.html,我正在做:

代码语言:javascript
复制
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文档

代码语言:javascript
复制
const instantiate = (bytes, imports = {}) =>
  WebAssembly.compile(bytes).then(m =>
    WebAssembly.instantiate(m, imports)
  )

我得到了一个不同的:

知道怎么修吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-09 11:25:10

从您的问题中还不清楚,但是进一步的注释解释说,您将导入对象保留为{},从而导致实例化失败。WebAssembly使用双重命名空间,其中导入对象实现WebAssembly.Module导入。每个导入都是规定作为module+field+kind,JavaScript导入对象必须实现这一点。

Emscripten已经生成了HTML+JS,它为您加载hello.wasm,包括WebAssembly导入对象。Emscripten生成的内容非常大,因为它模拟了一个操作系统。导入对象提供所有的syscalls (到JavaScript)。你得把这些传递给这个例子才行.或者直接使用已经生成的那些。

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

代码语言:javascript
复制
let importObject = {
  env: { foo: () => 42, bar: () => 3.14 }
};

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

缺少单个模块,或模块的字段,或者不匹配这类模块,都会导致正在获取的实例化失败。

票数 5
EN

Stack Overflow用户

发布于 2017-03-08 11:34:14

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42668708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档