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

Posted

技术标签:

【中文标题】WebAssembly:将命名空间从 C++ 库导出到 JavaScript【英文标题】:WebAssembly: Export namespace from C++ library to JavaScript 【发布时间】: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.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 文件中),或者如何从命名空间中指定应导出的函数。 您能否指导我如何实现这一目标?

感谢您的帮助!

【问题讨论】:

你是如何使用这个导出函数的?也请添加该代码。 感谢您的评论!在 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 文件之前失败(出现给定错误)。我之前尝试过测试库中的一个示例,它可以正常工作。感谢您在这方面帮助我! 【参考方案1】:

所以根据emscripten docs 使用ccallcwrap

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

我相信有other ways可以做到这一点;查看WebIDL Binder 和Embind。

【讨论】:

以上是关于WebAssembly:将命名空间从 C++ 库导出到 JavaScript的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中正确使用命名空间?

C++ 从 std::async 函数读取命名空间中的全局变量标志

未命名的命名空间和 Visual C++ 链接器性能

从C快速入门C++ 一.命名空间引用函数重载...

如何使用 Eclipse CDT 自动将类从命名空间中取出?

linux eclipse c++ 本地命名空间和“std::”