【问题标题】:EXPORTED_FUNCTIONS ignored during emcc compilation在 emcc 编译期间忽略 EXPORTED_FUNCTIONS
【发布时间】:2021-07-24 05:50:07
【问题描述】:

我正在尝试学习如何将 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 机器上测试了它(一台运行 ubuntu 20.04,另一台运行 18.04,两者都按照MDN website 中的说明从其 github 下载了最新版本的 emsdk)。 我还尝试使用所有其他带有“EXPORT”的 emcc 标志,但它们都收到了相同的警告。

这是我第一次构建 WASM 模块,我从互联网上学到了所有东西,所以我可能错过了一些关键步骤。我做错了吗?

我是否使用过时的工具?

对于我应该使用的 WASM 编译器,是否有更好/更新的 CPP?

谢谢! 伊泰

【问题讨论】:

    标签: c++ webassembly emcc emsdk


    【解决方案1】:

    -c 命令行选项会生成一个不是为直接执行而设计的 wasm 目标文件。然后您需要使用emcc(不带-c)链接该目标文件以获得最终的二进制文件。

    您只需从上面给出的示例命令行中删除-c,即可在单个命令中进行编译和链接。

    如果您使用 EMSCRIPTEN_KEEPALIVE,则不需要在命令行中使用 EXPORTED_FUNCTIONS,因为它们的用途相同。

    【讨论】:

    • 如果我在没有 -c 的情况下编译它会抛出一个错误,因为没有 main(我不想运行整个二进制文件,只是为了导出一些函数)。添加一个 main 函数是可行的,但它也在我的 wasm 输出中添加了很多“垃圾”。有没有办法只导出一个函数?
    • 要构建一个没有主函数的库,只需在命令行中添加--no-entry
    猜你喜欢
    • 2021-01-09
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    • 2011-03-19
    • 2013-09-10
    • 2011-11-27
    相关资源
    最近更新 更多