我正在努力学习如何将CPP编译成WASM,但我似乎无法让它正常工作。
我有一个简单的CPP代码,它实现了一个对给定整数平方的平方函数:
#ifdef __EMSCRIPTEN__
#include <emscripten.h>
#endif
int EMSCRIPTEN_KEEPALIVE squarer(int num) {return num * num;}我可以将其编译到WASM中,但是当我尝试将其加载到JS中时,它显示没有导出的函数。查看WAT版本(通过从wabt运行wasm2wat ),可以清楚地看出问题在于没有导出平方函数。
(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机器上测试了它(一台运行ubuntu20.04,另一台运行18.04,都是根据MDN website中的说明从github下载的最新版本的emsdk )。我还尝试使用所有其他带有"EXPORT“的emcc标志,但它们都收到了相同的警告。
这是我第一次构建WASM模块,我从互联网上学到了所有的东西,所以我可能错过了一些关键的步骤。我做错了吗?
我使用的是过时的工具吗?
有没有我应该使用的更好/更新的CPP to WASM编译器?
谢谢!Ittai
发布于 2021-07-25 11:01:46
-c命令行选项生成一个不能直接执行的wasm目标文件。然后,您需要使用emcc (没有-c)链接该对象文件,以获得最终的二进制文件。
只需从上面给出的示例命令行中删除-c,就可以在单个命令中同时执行编译和链接。
如果使用EMSCRIPTEN_KEEPALIVE,则不需要在命令行中使用EXPORTED_FUNCTIONS,因为它们具有相同的用途。
https://stackoverflow.com/questions/68507361
复制相似问题