C++ 构建 WASM,包括库

问题描述 投票:0回答:1

我在编译 WASM(包括 cmath 库)时遇到错误。

我需要做的是能够在 JavaScript 中使用 sqrt 函数...如果我删除 sqrt 函数和 cmath 库,一切正常...有人可以帮助我理解我做错了什么吗?

这里是 C++ 代码:

#include <cmath>
extern "C" {
  int Sum(int a, int b) {
    return a + b;
  }

  int sub (int a, int b){
    return a - b;
  }

  double root (int a){
    return sqrt(a);
  }
}

这是我在终端上运行来生成 WASM 文件的内容

em++ -std=c++2b "PATH_TO_CPP_FILE" -Oz -s WASM=1 -s SIDE_MODULE=1 -s BINARYEN_ASYNC_COMPILATION=0 -o "PATH_TO_A_FOLDER\FILENAME.wasm"

这是我正在使用的 JavaScript 代码:

const importObject = {
    module: {},
    env: {
      memory: new WebAssembly.Memory({ initial: 256 }),
    }
  };

  WebAssembly.instantiateStreaming(
    fetch('main.wasm'),
    importObject
  ).then(result => {
    const Sum = result.instance.exports.Sum;
    const sub = result.instance.exports.sub;
    console.log(Sum(4, 5));
    console.log(Sum(10, 10));
    console.log(sub(20, 10));
  });

最后这是我目前遇到的错误:

Uncaught (in promise) LinkError: WebAssembly.instantiate(): Import #0 module="env" function="_Z4sqrtIiENSt3__29enable_ifIXsr3std11is_integralIT_EE5valueEdE4typeES2_" error: function import requires a callable
javascript c++ webassembly emscripten
1个回答
0
投票

所以基本上,当您尝试在代码中包含某些库时,您还需要在 javascript 代码中导入该函数。 只需将其包含在 env 属性的 importObject 中即可。

环境:{

Z4sqrtIiENSt3__29enable_ifIXsr3std11is_integralIT_EE5valueEdE4typeES2(){}

}

现在假设您在项目中包含了多个库,并且您想要查看要导入哪些所有函数。 您可以在https://web assembly.github.io/wabt/demo/wasm2wat/上查看 在这里您可以包含您的 wasm 文件并查看您需要导入的所有函数。 您还可以在浏览器源选项卡上找到相同的信息,您可以在其中单击 wasm 文件来检查信息。

© www.soinside.com 2019 - 2024. All rights reserved.