Wasm:未捕获(在承诺中)TypeError:导入#0 module =“env”错误:模块不是对象或函数Promise.then(异步)(匿名)@(索引):9

Non*_*ary 9 javascript c emscripten webassembly

我是 emscripten 的新手,发现它非常困难...我有义务在 Windows 上工作,因为我必须测试我的应用程序的 .exe 版本。我用的是Windows 7。

我可以编译 wasm 但 javascript 无法读取它。这是我的代码。

C代码:

char * HelloWorld ()
{
    return "Hello World !";
}
Run Code Online (Sandbox Code Playgroud)

Emscripten 命令行:

emcc hello.c -O2 -s ONLY_MY_CODE=1 -s WASM=1 -s SIDE_MODULE=1 -s EXPORTED_FUNCTIONS="['_HelloWorld']" -o hello.wasm
Run Code Online (Sandbox Code Playgroud)

瓦特结果:

(module
  (type $t0 (func (result i32)))
  (type $t1 (func))
  (import "env" "memory" (memory $env.memory 256))
  (import "env" "memoryBase" (global $env.memoryBase i32))
  (func $_HelloWorld (export "_HelloWorld") (type $t0) (result i32)
    (get_global $env.memoryBase))
  (func $__post_instantiate (export "__post_instantiate") (type $t1)
    (set_global $g1
      (i32.add
        (get_global $env.memoryBase)
        (i32.const 16)))
    (set_global $g2
      (i32.add
        (get_global $g1)
        (i32.const 5242880))))
  (global $g1 (mut i32) (i32.const 0))
  (global $g2 (mut i32) (i32.const 0))
  (data (get_global $env.memoryBase) "Hello World !"))
Run Code Online (Sandbox Code Playgroud)

JavaScript:

importObject = {};

fetch('hello.wasm').then(response =>
  response.arrayBuffer()
).then(bytes =>
  WebAssembly.instantiate(bytes, importObject)
).then(results => {
  console.log("loaded");
});
Run Code Online (Sandbox Code Playgroud)

错误信息:

Uncaught (in promise) TypeError: Import #0 module="env" error: module is not an object or function
Promise.then (async)
(anonymous) @ (index):9
Run Code Online (Sandbox Code Playgroud)

你能告诉我我的代码有什么问题吗?

Mic*_*ole 6

我认为挑战在于:WebAssembly 尚未完全成熟。

这些示例显示了来自看起来像 NPM 包的加载程序。在该包中,importObj 是可选的。

你和我正在尝试使用 WebAssembly.instantiate() - 我正在使用网络工作者。

因此,我们需要传递更完整的导入 - 特别是具有中止方法的 env。以下是https://web assembly.studio的 assemblyscript 入门项目中的示例:

主要.html

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
</head>
<body style="background: #fff">
  <span id="container"></span>
  <script src="./main.js"></script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

main.js

WebAssembly.instantiateStreaming(fetch("../out/main.wasm"), {
  main: {
    sayHello() {
      console.log("Hello from WebAssembly!");
    }
  },
  env: {
    abort(_msg, _file, line, column) {
      console.error("abort called at main.ts:" + line + ":" + column);
    }
  },
}).then(result => {
  const exports = result.instance.exports;
  document.getElementById("container").textContent = "Result: " + exports.add(19, 23);
}).catch(console.error);
Run Code Online (Sandbox Code Playgroud)

主要.ts

WebAssembly.instantiateStreaming(fetch("../out/main.wasm"), {
  main: {
    sayHello() {
      console.log("Hello from WebAssembly!");
    }
  },
  env: {
    abort(_msg, _file, line, column) {
      console.error("abort called at main.ts:" + line + ":" + column);
    }
  },
}).then(result => {
  const exports = result.instance.exports;
  document.getElementById("container").textContent = "Result: " + exports.add(19, 23);
}).catch(console.error);
Run Code Online (Sandbox Code Playgroud)

注意 importObject 中的 env.abort 函数

  • 问题与 C 和 emscripten 有关) (2认同)