javascript - 将结构从 C 导出到 wasm?

标签 javascript c webassembly

我有一个包含以下声明的头文件:

typedef struct {
        double *vals;
        int len;
} List;

typedef struct {
        List *list;
        int sample;
} MarkedList;

我正在编译一个 C 文件,其中包含这些定义和一个采用 const *MarkedList 的函数:

clang --target=wasm32 -nostdlib -Wl,--export-all -Wl,--no-entry src/filename.c -o target/res/filename.wasm

我正在加载该文件:

WebAssembly.instantiateStreaming(fetch('res/mean.wasm'), {})
.then(results => {
    console.log(results)
});

控制台然后向我显示一个 wasm 模块,其中包含我定义的函数,但不包含结构。如何从我的 javascript results 对象访问结构?

最佳答案

为了解决这个问题,我更改了很多代码,但我会尽力写出我的整体解决方案的摘要。首先,我通过 clang 切换到 emcc,以便标准库 C 功能(如 malloc)在 wasm 中工作(请参阅 How to implement "malloc" in Wasm )。虽然这是一个非常严厉的解决方案,但我相信 LTO 可以减少一些未使用的功能。

其次,我已尽力封装 ListMarkedList 结构体的 API,以便仅与数字类型(包括指针)进行通信的有用函数导出到JS,符合WebAssembly标准。因此,List *malloc_list(void)void push_list(List *l, double v) 在这种情况下是有意义的,但任何具有 API 的内容都取决于内部 -结构的内存表示(例如,访问单个字段)是不可能的。

因此,虽然没有广泛适用的方法来导出结构,但有一些解决方法可以在 C 中保留尽可能多的内容,在 JS 中保留尽可能少的内容,并且我能够从列表中完成我需要的内容和 MarkedList 结构。

关于javascript - 将结构从 C 导出到 wasm?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67715354/

相关文章:

c - 如何在 gcc/mingw 中进行边界检查?

rust - 如何在 Rust crate 中编译为 wasm 和二进制文件?

javascript - 在 .md 文件 : How to add background color to a text? 或将文本放在彩色框中?

javascript - 通过 JavaScript 或 jQuery 控制 CSS

c - 有没有更简单的方法将结构转换为指向结构的指针

c - learn c hard way章节堆和栈代码

javascript - Web 程序集 - 整数值错误

javascript - 如何在 React-Native 中加载 .wasm 文件?

javascript - 如何在一个 div 中构建一个包含所有输入类的数组?

Javascript document.getElementById 问题