为啥 emscripten 不编译我的函数?

Posted

技术标签:

【中文标题】为啥 emscripten 不编译我的函数?【英文标题】:Why won't emscripten compile my functions?为什么 emscripten 不编译我的函数? 【发布时间】:2018-09-25 22:24:50 【问题描述】:

我正在尝试将一些 c++ 代码编译成包含函数的 wasm 二进制文件。但是,即使我在编译过程中没有收到任何编译错误或任何其他警告,emscripten 生成的文件也不包含我用“-s EXPORTED_FUNCTIONS=['....']”导出的函数

这是我要导出的函数文件: https://pastebin.com/B5w1R4BC

这是我正在使用的编译命令:

em++ -s WASM=1 -s ALLOW_MEMORY_GROWTH=1 \
-Igameoflife/include -Os -DNDEBUG \
-s EXPORTED_FUNCTIONS="['_GOL_Instance_new', '_GOL_Instance_destroy', '_GOL_Init', '_GOL_Step', '_GOL_get_values']" \
-o gol.js gameoflife/src/cellmap.cpp bridge.cpp

运行没有任何问题。

但是,当我将“gol.js”导入 javascript 时,Module 对象无法访问我尝试包含的任何函数(我正在等待模块在调用这些函数之前被初始化)。

TypeError: Module._GOL_Instance_new is not a function

为什么我无法通过 wasm 访问这些功能?

【问题讨论】:

【参考方案1】:

它们很可能被您的 C++ 编译器破坏了。将它们声明为extern "C" 以避免这种情况:

extern "C"
GOL_Instance *
GOL_Instance_new() 
...

【讨论】:

哇,这就像一个魅力。现在js可以查看函数了。我在任何地方都没有找到任何提及这一点。我怎么会想到这个? 提到了here,但更多的是旁白。

以上是关于为啥 emscripten 不编译我的函数?的主要内容,如果未能解决你的问题,请参考以下文章

Emscripten/NodeJS:使实际的文件系统默认可用

将 C/C++ 套接字传递给 EM_ASM 以在 Emscripten 中用作 websocket

为啥 LLVM 窗口中缺少 LLC.exe?

为啥我在 emscripten 使用“#version 300 es”得到“不支持的着色器版本”?

错误:未定义符号:gzclose opencv emscripten

如何在 React 中使用 Emscripten JavaScript 文件