我正在尝试学习如何将 CPP 编译到 WASM 中,但我似乎无法让它正常工作。
我有一个简单的 CPP 代码,它实现了一个对给定整数进行平方的平方函数:
#ifdef __EMSCRIPTEN__
#include <emscripten.h>
#endif
int EMSCRIPTEN_KEEPALIVE squarer(int num) {return num * num;}
我可以将它编译成 WASM,但是当我尝试在 JS 中加载它时,它说没有导出函数。查看 WAT 版本(通过从 wabt 运行 wasm2wat)很明显,问题在于 squarer 函数没有被导出。
(module
(type $t0 (func (param i32) (result i32)))
(import "env" "__linear_memory" (memory $env.__linear_memory 0))
(import "env" "__indirect_function_table" (table $env.__indirect_function_table 0 funcref))
(func $_Z7squareri (type $t0) (param $p0 i32) (result i32)
(i32.mul
(local.get $p0)
(local.get $p0))))
所以我尝试使用 EXPORTED_FUNCTIONS 标志再次编译(请参见以下行),但我收到以下警告并且 squarer 函数仍未导出。
$ emcc squarer.cc -o squarer.wasm -c -O1 -s EXPORTED_FUNCTIONS="_Z7squareri","squarer"
emcc: warning: linker setting ignored during compilation: 'EXPORTED_FUNCTIONS' [-Wunused-command-line-argument]
当我编辑 WAT 以包含导出(通过更改func $_Z7squareri
为func (export "squarer")
)并将其编译回 WASM 时,JS 成功加载了该函数,因此似乎缺少导出确实是问题所在。
我在两台 linux 机器上测试了它(一台运行 ubuntu 20.04,另一台运行 18.04,两者都按照MDN 网站中的说明从他们的 github 下载了最新版本的 emsdk )。我还尝试使用所有其他带有“EXPORT”的 emcc 标志,但它们都得到了相同的警告。
这是我第一次构建 WASM 模块,我从互联网上学到了所有东西,所以我可能错过了一些关键步骤。我做错了吗?
我是否使用过时的工具?
我应该使用 WASM 编译器的更好/更新的 CPP 吗?
谢谢!伊泰