У меня есть несколько файлов C ++ с функциями, которые я пытаюсь скомпилировать в wasm. По какой-то причине, даже несмотря на то, что emscripten компилирует файлы с экспортированными функциями в wasm, я продолжаю получать ‘TypeError: ___ не является функцией’, когда я пытаюсь использовать функции.
Вот файл ‘bridge.cpp’, который содержит все функции, которые я хочу экспортировать:
/*
* Bridge from JS into the cellmap computation code in Wasm
*/
#include <gameoflife.h>
#include <constants.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <cstring>
/**
* A struct that manages our instantiation of
* the game of life
*/
typedef struct {
cellmap *cm; /** holds the instance of the cellmap */
unsigned char *cells; /** holds the cell vals for current iteration */
} GOL_Instance;
/**
* Constructor for the game of life engine
*/
GOL_Instance *
GOL_Instance_new() {
GOL_Instance *gol;
gol = (GOL_Instance *)malloc(sizeof *gol);
if (gol) {
memset(gol, 0, sizeof *gol);
}
gol->cm = new_cellmap();
return gol;
}
/**
* Method to destroy the gol instance when the user is done
*/
void
GOL_Instance_destroy(GOL_Instance *gol) {
gol->cm->~cellmap();
delete[] gol->cells;
free(gol);
}
/**
* Method to initialize the gol instance
*/
void
GOL_Init(GOL_Instance *gol) {
gol->cm->init();
gol->cells = gol->cm->return_cells();
}
/**
* Method to run the gol instance by one step
*/
void
GOL_Step(GOL_Instance *gol) {
gol->cm->next_generation();
gol->cells = gol->cm->return_cells();
}
/**
* Method to get the cell values
*/
void
GOL_get_values(GOL_Instance *gol, int8_t *arr) {
unsigned char *c = gol->cells;
unsigned int total_cells = cellmap_width * cellmap_height;
for (unsigned int i = 0; i < total_cells; i++) {
unsigned int curr_ind = i * 8;
int8_t curr = (int8_t) *(c+i) & 0x01;
*(arr + curr_ind) = curr;
}
}
Затем я использую emscripten для компиляции кода:
em++ -s WASM=1 -s ALLOW_MEMORY_GROWTH=1 \
-Igameoflife/include -Os -DNDEBUG \
-s EXPORTED_FUNCTIONS="['_GOL_Instance_new', '_GOL_Instance_destroy', '_GOL_Init', '_GOL_Step', '_GOL_get_values']" \
-o gol.js gameoflife/src/cellmap.cpp bridge.cpp
И эта команда дает мне файлы ‘gol.js’ и ‘gol.wasm’, которые, кажется, компилируются без каких-либо ошибок.
Однако, когда в моем javascript я пытаюсь фактически использовать данную функциональность (примечание: я использую функции в SVG-файле, поэтому мои теги ‘href’ находятся в другом пространстве имен):
<script xlink:href="gol.js"></script>
<script><![CDATA[
var wasm_loaded = false;
var gol_instance;
const cols = 96;
const rows = 96;
var cellArr = new Int8Array(cols * rows);
const box_side = 10; // boxes are 10 pixels accross
Module.onRuntimeInitialized = function() {
wasm_loaded = true;
gol_instance = Module._GOL_Instance_new();
}
.
.
.
Затем в консоли вывод из Chrome, когда я размещаю страницу локально, я получаю
не удалось скомпилировать потоковую передачу wasm: Ошибка типа: Module._GOL_Instance_new не является функцией
и сбой JavaScript.
Я попытался скомпилировать с помощью ‘-s EXPORT_ALL = 1’, но функция не может быть найдена. Кроме того, кажется, что файл ‘gol.wasm’ нехарактерно мал (всего 12 символов). Я не уверен, что это может указывать на проблему, но я подумал, что это может быть относительно.
Задача ещё не решена.
Других решений пока нет …