将结构从 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 可以减少一些未使用的功能。
其次,我已尽最大努力封装 List
和 MarkedList
结构的 API,以便仅与纯数字类型(包括指针)通信的有用函数被导出到 JS,符合 WebAssembly 标准。因此 List *malloc_list(void)
和 void push_list(List *l, double v)
在这种情况下是有意义的,但是任何具有 API 取决于结构的内存表示(例如,访问独立字段)的东西都会不可能。
因此,虽然没有广泛适用的导出结构的方法,但有一些变通方法可以尽可能多地保留在 C 中,尽可能少地保留在 JS 中,并且我能够完成我需要的工作List 和 MarkedList 结构。
我有一个包含以下声明的头文件:
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 可以减少一些未使用的功能。
其次,我已尽最大努力封装 List
和 MarkedList
结构的 API,以便仅与纯数字类型(包括指针)通信的有用函数被导出到 JS,符合 WebAssembly 标准。因此 List *malloc_list(void)
和 void push_list(List *l, double v)
在这种情况下是有意义的,但是任何具有 API 取决于结构的内存表示(例如,访问独立字段)的东西都会不可能。
因此,虽然没有广泛适用的导出结构的方法,但有一些变通方法可以尽可能多地保留在 C 中,尽可能少地保留在 JS 中,并且我能够完成我需要的工作List 和 MarkedList 结构。