C++构建WASM,包括库

x33g5p2x  于 2023-08-09  发布在  其他
关注(0)|答案(1)|浏览(143)

我正在努力与一个错误编译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

omjgkv6w

omjgkv6w1#

所以基本上,当你试图在代码中包含一些库时,你需要在JavaScript代码中导入该函数。只需将其包含在env属性上的importObject中。
env:{

  • Z4sqrtIIENSt3__29enable_ifIXsr3std11is_integralIT_EE5valueEdE4typeES2*(){}

}
现在假设你在你的项目中包含了多个库,你想看看哪些函数要导入。您可以在https://webassembly.github.io/wabt/demo/wasm2wat/上检查它,在这里您可以包含您的wasm文件并查看您需要导入的所有函数。你也可以在浏览器源标签上找到相同的信息,在那里你可以点击wasm文件来检查信息。

相关问题