在JS中从Emscripten编译的WASM创建 WebAssembly.Instance ,其中包含对 sprintf 的调用,导致此错误:
未捕获(承诺)LinkError:WebAssembly.Instance():导入#1 module =“env”function =“ _sprintf ”错误:函数导入需要可调用...
sprintf 不是included by Emscripten作为libc的一部分吗?
代码:
#include <stdio.h>
extern "C" {
int main() {
char buffer [50];
int n, a=5, b=3;
n=sprintf (buffer, "%d plus %d is %d", a, b, a+b);
return 0;
}
}
编译命令:
emcc src/test.cpp -O3 -s WASM=1 -s SIDE_MODULE=1 -o out/test.wasm
emcc 编译运行时没有错误。
注释掉 sprintf 行没有错误按预期返回0。
出现此错误的原因是什么?使用sprintf时如何避免?
答案 0 :(得分:1)
Emscripten是否将sprintf作为libc的一部分包含在内?
您正在使用SIDE_MODULE=1
进行编译,根据定义,它不会在系统库中链接。
您可以提供自己的sprintf
实现或停止编译作为副模块,并允许emscripten为您处理。