这是我的C代码:
#include <emscripten.h>
#ifdef __cplusplus
extern "C" {
#endif
EMSCRIPTEN_KEEPALIVE int add(int a, int b) {
return a + b;
}
#ifdef __cplusplus
}
#endif
我用这样的命令运行它:emcc -O3 add.c -s EXPORTED_FUNCTIONS=_add
,它给出我的wasm输出接近我想要的,但名称被篡改了,转储的输出如下所示:
Type[2]:
- type[0] () -> nil
- type[1] (i32, i32) -> i32
Function[2]:
- func[0] sig=0 <b>
- func[1] sig=1 <c>
Table[1]:
- table[0] type=funcref initial=1 max=1
Memory[1]:
- memory[0] pages: initial=256 max=256
Export[4]:
- memory[0] -> "a"
- func[0] <b> -> "b"
- func[1] <c> -> "c"
- table[0] -> "d"
Code[2]:
- func[0] size=3 <b>
- func[1] size=7 <c>
这里c
是被篡改的add
,有什么方法可以告诉emcc不要篡改它的名称吗?
emscripten输出的JS库将导出未处理的名称,以便您仍然可以在外部使用。
为了节省空间,从wasm导出到JS的名称被缩小了,但JS知道然后用它们的原始名称将它们导出到外部。您可以将WebAssembly的这些导出视为JS和emscripten生成的WebAssembly之间的内部契约。它们不是为您直接访问而设计的。
如果你想让emscripten生成一个设计用于直接/外部消费的WebAssembly模块,而不想让emscripten生成JS加载程序代码,你可以使用以下方法之一输出一个独立的wasm文件:
- 指定以
.wasm
结尾的输出名称(例如-o out.wasm
( - 通过
-sSTANDALONE_WASM
在此模式下,您不应看到名为minimied的导出。