我正在尝试使用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.wasm
、randomLHS.js
和randomLHS.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文档关于使用ccall
和cwrap
:
这些方法可以与已编译的C函数一起使用——名称被篡改的C++函数将不起作用。
我相信还有其他方法可以做到这一点;查看WebIDL Binder和Embind。