WebAssembly LinkError: _sprintf function import requires a callable

WebAssembly LinkError: _sprintf function import requires a callable

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

Uncaught (in promise) LinkError: WebAssembly.Instance(): Import #1 module="env" function="_sprintf" error: function import requires a callable...

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

Is sprintf not included by Emscripten as part of libc?

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

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