WebAssembly LinkError:_sprintf函数导入需要可调用

时间:2017-07-23 02:12:29

标签: emscripten webassembly

在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时如何避免?

1 个答案:

答案 0 :(得分:1)

  

Emscripten是否将sprintf作为libc的一部分包含在内?

您正在使用SIDE_MODULE=1进行编译,根据定义,它不会在系统库中链接。

您可以提供自己的sprintf实现或停止编译作为副模块,并允许emscripten为您处理。