我在编译 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 代码中导入该函数。 只需将其包含在 env 属性的 importObject 中即可。
环境:{
Z4sqrtIiENSt3__29enable_ifIXsr3std11is_integralIT_EE5valueEdE4typeES2(){}
}
现在假设您在项目中包含了多个库,并且您想要查看要导入哪些所有函数。 您可以在https://web assembly.github.io/wabt/demo/wasm2wat/上查看 在这里您可以包含您的 wasm 文件并查看您需要导入的所有函数。 您还可以在浏览器源选项卡上找到相同的信息,您可以在其中单击 wasm 文件来检查信息。