我有一个包含以下声明的头文件:
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 可以减少一些未使用的功能。
其次,我已尽力封装 List
和 MarkedList
结构体的 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/