【问题标题】:Can't Bind C++ Class With Emscripten无法使用 Emscripten 绑定 C++ 类
【发布时间】:2022-01-01 19:22:55
【问题描述】:

在 c++ 中使用 emscripten,尝试绑定一个简单的类,该类只有一个静态函数,没有别的。我在官方文档和其他地方看到的示例非常简单。所以我不明白为什么这不起作用:

EMSCRIPTEN_BINDINGS(LLWI_COLLECTION){ 
    emscripten::class_<LLWI>("LLWI")
        .class_function("prepare", &LLWI::prepare)
        ;
}

Intellisense 给出错误:no instance of constructor "emscripten::class_::class_ [with ClassType=LLWI, BaseSpecifier=emscripten::internal::NoBaseClass]" 与参数列表匹配 - - 参数类型是:(const char [5])

这意味着这不是 class_ 的有效构造函数,但是,我通过了 bind.h,我找到了构造函数,应该没有任何问题,它确实需要一个 const char* 作为参数。坦率地说,我不明白这怎么行不通,我看到的每个例子都和我做过的一样。

顺便说一句,即使智能感知给出错误,emcc 编译也没有问题。但在浏览器中我收到错误:wasm 流编译失败:TypeError:无法在“WebAssembly”上执行“编译”:响应 MIME 类型不正确。预期为“应用程序/wasm”。

当我尝试从控制台调用 Module.LLWI.prepare() 时,它是未定义的。

【问题讨论】:

    标签: webassembly emscripten


    【解决方案1】:

    由于您遗漏了很多信息,因此我只指出我个人需要了解的内容才能覆盖基地。

    1. 您如何加载.wasm 模块?您是否使用带有 index.html 的纯香草 js?或者使用reactjsnextjs 之类的东西来加载? Webpack 现在有用于加载 .wasm 模块的特定选项。

    2. 您使用什么标志/选项来编译模块?你能分享整个 CLI 命令来编译吗?

    3. 就智能感知而言,IDE 听起来是个明确的问题。我在emscripten 中使用带有CMakeLists.txt 的vscode,并且在那部分智能感知没有任何问题。如果那是你的工具包,我正在写一篇关于如何设置它的博客。

    如果您正在使用 vanilla js 并使用某种静态服务器(如 python3 -m http.server)服务,this 特定的提交有一个对我有用的 2-classes-example 文件夹。 WASM 是异步加载的,因此一旦加载就需要调用它。只需按照示例进行操作,它应该可以正常工作(手指交叉)。

    如果你使用 webpack 和 ReactJS 之类的东西,请确保在编译时使用这些标志:

    ENVIRONMENT=web
    MODULARIZE=1
    EXPORT_ES6=1
    

    和可选的DEMANGLE_SUPPORT=1(只是因为我正在使用它并且它有效)。对于webpack.config.js,包括以下内容:

    module.exports = {
        ...
        experiments: {
          asyncWebAssembly: true,
        },
        output: {
          ...
          webassemblyModuleFilename: "static/wasm/[modulehash].wasm",
        },
        ...
    }
    

    现在你可以导入[module].js,它会在你的react项目中加载[module].wasm

    如果您想使用 CMakeLists.txt 设置您的 C++ 项目,请通过 twitter 与我联系,我非常乐意帮助您设置。

    【讨论】:

    • 是的,我使用的是 vanilla .js,我输出的是一个 .html 文件,甚至没有使用自定义文件。我有一个 c++ bg,但对 .js 和 .html 不太熟悉。我试图从浏览器中的控制台调用函数准备,它说未定义,因为函数中有一个 cout 调用,ofc 它会说 bcs 它是一个 syscll,所以它实际上是在说未定义,当我'已经从函数返回了一个值,我可以看到它有效。关于智能感知,我正在使用带有 vscode 的 c++ 智能感知扩展,我刚刚更新了 isense,它停止给出错误。感谢您的帮助。
    • 如果您需要打印一些内容到控制台,请使用&lt;emscripten/html5.h&gt;。它有emscripten_console_log(f)emscripten_console_error(f)f 版本的工作方式类似于 printf
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    相关资源
    最近更新 更多