Javascript无法找到使用emscripten编译的导出WASM函数

问题描述 投票:0回答:1

我有一些c ++文件,其中包含我正在尝试编译的函数。出于某种原因,即使文件是通过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流编译失败:TypeError:Module._GOL_Instance_new不是函数

和javascript崩溃。

我尝试使用'-s EXPORT_ALL = 1'进行编译,但仍无法找到该函数。此外,似乎'gol.wasm'文件非常小(仅12个字符)。我不确定这是否可以表明问题,但我认为这可能是相对的。

c++ svg web emscripten jwasm
1个回答
0
投票

将以下内容添加到Build-Command中,-s EXTRA_EXPORTED_RUNTIME_METHODS='["ccall", "cwrap"]'应解决该错误

© www.soinside.com 2019 - 2024. All rights reserved.