Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将结构从C导出到wasm?_Javascript_C_Webassembly - Fatal编程技术网

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为您完成导出和绑定工作。这主要是一个规模的问题。