Я пытаюсь научиться веб-сборке.Я могу скомпилировать wasm из C-кода.Тем не менее, я испытываю большие трудности, пытаясь заставить мой код работать в Firefox.Мой код очень прост:
hello.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
</body>
<script async type="text/javascript" src="hello.js"></script>
</html>
hello.js
"use strict";
const imports = {
env: {
"abort": function() {},
"memoryBase": 0,
"tableBase": 0,
"memory": new WebAssembly.Memory({ initial: 4 }),
"table": new WebAssembly.Table({ initial: 0, element: 'anyfunc' }),
}
}
WebAssembly.instantiateStreaming(fetch('hello.wasm'), imports)
.then(obj => console.log(obj.instance.exports._add(1, 2)))
.catch(error => console.log(error));
hello.c
#include <emscripten.h>
EMSCRIPTEN_KEEPALIVE int add(x, y) { return x + y; }
Я компилирую свой код следующим образом:
emcc hello.c -O1 -g4 -s WASM=1 -s SIDE_MODULE=1 -o hello.wasm --source-map-base http://localhost:8080/ --emrun
и использую emrun для обслуживания моих файлов
emrun --no_browser --port 8080 .
Проблема
Изначально Firefox жаловался на LinkError: "import object field 'abort' is not a Function".
Проверка hello.wast, сгенерированного во время компиляции, похоже, что действительно необходима функция прерывания (я предполагаю, что abort()
- ожидаемая часть времени выполнения C).Итак, я добавил строку "abort": function() {},
в раздел env imports
.
Но теперь я получаю LinkError: "imported Table with incompatible size".
Я в недоумении от того, что пытается показать эта ошибка.Как я могу заставить мой wasm-код работать?
Я пытаюсь отладить Firefox Developer Edition 63.0b8 (64-разрядная версия).emcc 1.38.11.