WebAssembly.instantiate не работает, если файл wasm был скомпилирован с помощью clang++, но работает с clang.
Когда код C/C++ .wasm компилируется с clang
(C) - загружается в Chrome и работает хорошо, но когда с clang++
(C++) - загрузка wasm завершилась ошибкой (в консоли JS):
Uncaught (in promise) LinkError: WebAssembly.instantiate(): Import #1 module="wasi_snapshot_preview1" function="fd_close" error: function import requires a callable
Зачем?
Аргументы компиляции WASM:
"clang", <=== I only changed this to "clang++" - and it fails
"-O0",
// "-std=c++14",
"--target=wasm32-unknown-wasi",
"--sysroot C:\\OpenGL\\wasi-sdk-11.0-mingw.tar\\wasi-sdk-11.0\\share\\wasi-sysroot",
"-fno-exceptions",
"-nostartfiles",
"-Wl,--import-memory",
"-Wl,--no-entry",
"-Wl,--export-all",
"-o templates/my-app/public/hello_wasm.wasm",
"wasm/hello_wasm.cpp"
Код загрузки JS wasm:
const response = await fetch("./hello_wasm.wasm");
const bytes = await response.arrayBuffer();
const { instance } = await WebAssembly.instantiate(bytes, {
env: { memory: this.memory },
},
});
this.instance = instance;
console.log("c" + instance);
})();
hello_wasm.cpp (компиляция прошла без ошибок):
#include <math.h>
// extern "C"
// {
int int_sqrt(int x)
{
return sqrt(x);
};
float *run_sin(float x[], int n)
{
// float *a = new float[n];
float *a = (float *)malloc(sizeof(float) * n);
for (int i = 0; i < n; i++)
{
a[i] = x[i] * 2;
}
return a;
}
LLVM v10 Я использую wasi sysroot из https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-11/wasi-sdk-11.0-mingw.tar.gz
Также обсуждаем эту проблему здесь https://github.com/WebAssembly/wasi-sdk/issues/145
1 ответ
Чтобы запустить двоичный файл WASI в Интернете, вам необходимо предоставить реализацию API-интерфейсов WASI. Веб-платформа изначально не поддерживает WASI. Есть несколько полифилов, которые пытаются имитировать некоторые / все API WASI, которые могут работать в вашем случае.