Javascript 将结构从C导出到wasm?
我有一个包含以下声明的头文件:Javascript 将结构从C导出到wasm?,javascript,c,webassembly,Javascript,C,Webassembly,我有一个包含以下声明的头文件: typedef struct { double *vals; int len; } List; typedef struct { List *list; int sample; } MarkedList; 我正在编译一个C文件,其中包含这些定义和一个函数,该函数采用const*MarkedList: clang--target=wasm32-nostlib-Wl,--export all-Wl,-
typedef struct {
double *vals;
int len;
} List;
typedef struct {
List *list;
int sample;
} MarkedList;
我正在编译一个C文件,其中包含这些定义和一个函数,该函数采用const*MarkedList
:
clang--target=wasm32-nostlib-Wl,--export all-Wl,--no entry src/filename.c-o target/res/filename.wasm
我正在加载该文件,其中包含:
WebAssembly.instanceStreaming(fetch('res/mean.wasm'),{}
。然后(结果=>{
console.log(结果)
});
然后,控制台向我显示一个wasm模块,其中instance.exports包含我定义的函数,但不包含结构。如何从我的javascript
结果
对象访问结构?为了解决这个问题,我已经修改了很多代码,但我会尽我所能写出我的总体解决方案的摘要。首先,我切换到emcc over clang,以便标准库C功能(如malloc)在wasm中工作(请参阅)。虽然这是一个非常繁重的解决方案,但我相信LTO可以减少一些未使用的功能
其次,我已经尽了最大努力封装了List
和MarkedList
结构的API,以便按照WebAssembly标准,只将与数字类型(包括指针)通信的有用函数导出到JS。因此List*malloc\u List(void)
和void push\u List(List*l,double v)
在这种上下文中是有意义的,但是任何API依赖于结构的内存表示(例如,访问独立字段)的操作都是不可能的
因此,虽然没有广泛适用的导出结构的方法,但有一些变通方法可以在C中保留尽可能多的内容,在JS中保留尽可能少的内容,并且我能够从列表和标记列表结构中完成我需要的内容。您不能导出类或结构,只能导出实例,即符号。如果您创建
标记列表的全局实例
,您应该能够导出该实例(即其在内存中的地址)@sbc100哦,谢谢。如何在JS中分配或实例化结构?有几种方法。最低级别的方法是调用模块。还有更高级别的绑定解决方案,如embind:>因此,虽然没有广泛适用的方法导出结构,但如果您使用的是Emscripten,那么-embind允许导出结构、类等@Router我发现了这个页面,我的理解是它只适用于C++类,这些类最终是在上面提出的解决方案中的,但是用C++代替CThat的正确,但是现在你需要手动在C和JS两边提供自定义绑定。相反,您可以只为Embind注释创建一个cpp文件,并将其与C代码库一起编译并链接,然后让Emscripten为您完成导出和绑定工作。这主要是一个规模的问题。