У меня есть следующий C++ код:
#include <emscripten.h>
#include <emscripten/val.h>
#include <stdio.h>
using namespace emscripten;
extern "C" {
EMSCRIPTEN_KEEPALIVE
extern void loop() {
val console = val::global("console");
console.call<void>("log", std::string("Test"));
}
}
И у меня есть код JS:
//"bytecode" содержит .wasm файл
const wasmModule = new WebAssembly.Module(bytecode);
const imports = {};
imports.env = {
__memory_base : 0,
__table_base : 0,
memory: new WebAssembly.Memory({ initial: 256 }),
table: new WebAssembly.Table({ initial: 0, element: 'anyfunc' })
};
const wasmInstance = new WebAssembly.Instance(wasmModule, imports);
console.log(wasmInstance.exports);
Как скомпилировать код C++ с помощью Emscripten, чтобы функцию loop было видно из JavaScript?
Я пробовал кучу разных вариаций из разных примеров, но у меня ничего не получилось.
(new WebAssembly.Instance возвращает ошибку
import object field '__ZdlPv' is not a Function)
EDIT: На данный момент, я использую команду em++ -s WASM=1 -s SIDE_MODULE=1 -std=c++17 -O3 src/Main.cpp -o dest/Main.wasm.
Насколько я понял, в importObject'е нужно указывать ряд функций (включая __ZdlPv), но откуда их взять?
Для компиляции кода выполните следующую команду:
emcc src/module.cc -o example.html -s EXPORTED_FUNCTIONS='["_loop"]' -s EXTRA_EXPORTED_RUNTIME_METHODS='["ccall", "cwrap"]'
Подключите получившийся .js файл и далее вызывайте функцию через ccall, либо сделайте обертку с помощью cwrap. Я использовал ccall в консоли браузера:
Module.ccal('_loop')
Я пробовал кучу разных вариаций из разных примеров, но у меня ничего не получилось. (new WebAssembly.Instance возвращает ошибку import object field '__ZdlPv' is not a Function)
Похоже, что имена функций у Вас все-таки мангляться. Не вижу необходимости в использовании ключевого слова extern в данном месте (поправьте меня, если это не так):
extern void loop() {
val console = val::global("console");
console.call<void>("log", std::string("Test"));
}
Продвижение своими сайтами как стратегия роста и независимости