将结构从 C 导出到 wasm?

Export a structure from C to wasm?

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

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 模块,其中 instance.exports 包含我定义的函数,但 结构。如何从我的 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 中,并且我能够完成我需要的工作List 和 MarkedList 结构。