4

sprintfへの呼び出しを含む Emscripten でコンパイルされた WASM から JS でWebAssembly.Instanceを作成すると、次のエラーが発生します。

キャッチされていない (約束) LinkError: WebAssembly.Instance(): インポート #1 module="env" function=" _sprintf " エラー: 関数のインポートには呼び出し可能なものが必要です...

sprintfはlibc の一部としてEmscripten に含まれていませんか?

コード:

#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

sprintf は libc の一部として Emscripten に含まれていませんか?

SIDE_MODULE=1定義上、システム ライブラリにリンクしないコンパイルを行っています。

独自の実装を提供するsprintfか、サイド モジュールとしてコンパイルを停止し、emscripten に任せることができます。

于 2017-07-23T12:14:02.413 に答える