【发布时间】:2020-08-06 16:36:48
【问题描述】:
我正在尝试使用 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 文件中),或者如何从命名空间中指定应导出的函数。
您能否指导我如何实现这一目标?
感谢您的帮助!
【问题讨论】:
-
你是如何使用这个导出函数的?也请添加该代码。
-
感谢您的评论!在 JavaScript 中,我首先使用
const randomLHS = Module.cwrap('_randomLHS ', 'number', ['number', 'number']);定义函数,然后像这样使用它:const draws = randomLHS(100,3),然后创建一个 LHS,其中包含 3 个变量的 100 次绘制。这是根据其文档在 JS 中使用 emscripten 调用从 C++ 导出的函数的默认方式。这能回答你的问题吗? -
当然,没问题。部分。您能否请edit您的问题并在加载模块后添加示例
.html文件?实际上,我正在寻找minimal, reproducible example。 -
你能在命名空间下导出和运行测试函数吗?如果没有,你应该先试试。或者,它是特定于这个库的吗?
-
对不起,我目前正在度假,无法使用电脑!实际上,最小的工作示例是克隆 lhslib,然后使用原始问题中概述的构建命令,因为该命令在实际构建 HTML 文件之前失败(出现给定错误)。我之前尝试过测试库中的一个示例,它可以正常工作。感谢您在这方面帮助我!
标签: c++ webassembly emscripten