4

在 JS 中从 Emscripten 编译的 WASM创建WebAssembly.Instance ,其中包括对sprintf的调用,会导致此错误:

未捕获(承诺中) LinkError: WebAssembly.Instance(): Import #1 module="env" function=" _sprintf " 错误:函数导入需要可调用的...

Emscripten不包含sprintf作为 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 时如何避免?

4

1 回答 1

3

Emscripten 不包含 sprintf 作为 libc 的一部分吗?

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

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

于 2017-07-23T12:14:02.413 回答