WebAssembly:将命名空间从C++库导出到JavaScript



我正在尝试使用emscripten(emcc v.1.40.1,clang v.12.0.0,macOS 10.15.5(将lhslib库(用C++编写(移植到WebAssembly。不幸的是,我对C++的理解非常有限,所以请耐心等待。

到目前为止,我分叉了repo,创建了一个build文件夹,并从那里开始尝试将randomLHS.cpp文件转换为WASM:

// a short overview of what the file looks like
#include "LHSCommonDefines.h"
#include "utilityLHS.h"
namespace lhslib 
{
void randomLHS(int n, int k, bclib::matrix<int> & result, bclib::CRandom<double> & oRandom)
{
// further contents of the file
}
}

运行

emcc ../src/lhslib/randomLHS.cpp -I../src/bclib -o randomLHS.html

创建所需的文件randomLHS.wasmrandomLHS.jsrandomLHS.html
但是,当提供html文件并检查emscripten创建的Module对象时,它不包含所需的randomLHS函数。

然后我阅读了关于EXPORTED_FUNCTIONS选项的内容,并尝试了以下

emcc ../src/lhslib/randomLHS.cpp -I../src/bclib -o randomLHS.html -s EXPORTED_FUNCTIONS='["_randomLHS"]' -s EXPORTED_RUNTIME_METHODS='["ccall", "cwrap"]'

这会导致以下错误:

emcc: error: undefined exported function: "_randomLHS" [-Wundefined] [-Werror]

不幸的是,我找不到任何示例来展示如何导出命名空间(如randomLHS文件中(,或者如何从应该导出的命名空间中指定函数。你能指导我如何做到这一点吗?

谢谢你的帮助!

因此,根据emscripten文档关于使用ccallcwrap:

这些方法可以与已编译的C函数一起使用——名称被篡改的C++函数将不起作用。

我相信还有其他方法可以做到这一点;查看WebIDL Binder和Embind。

相关内容

  • 没有找到相关文章

最新更新