我正在努力与一个错误编译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
型
1条答案
按热度按时间omjgkv6w1#
所以基本上,当你试图在代码中包含一些库时,你需要在JavaScript代码中导入该函数。只需将其包含在env属性上的importObject中。
env:{
}
现在假设你在你的项目中包含了多个库,你想看看哪些函数要导入。您可以在https://webassembly.github.io/wabt/demo/wasm2wat/上检查它,在这里您可以包含您的wasm文件并查看您需要导入的所有函数。你也可以在浏览器源标签上找到相同的信息,在那里你可以点击wasm文件来检查信息。