将 emscripten webassembly 线程 (C++) 与 webpack (create-react-app) 一起使用

Posted

技术标签:

【中文标题】将 emscripten webassembly 线程 (C++) 与 webpack (create-react-app) 一起使用【英文标题】:Use emscripten webassembly threads (C++) with webpack (create-react-app) 【发布时间】:2020-09-30 04:35:50 【问题描述】:

我有一个 emscripten/webassembly 包装的 C++ 类,它在内部启动和使用 pthread。在其独立开发沙箱中的 Chrome 上的 javascript 中使用时,它通常可以正常工作。但是,我真的不能让它与 create-react-app 和 webpack 一起工作(即我使用 react-app-rewired 来配置 webpack)。

问题似乎来自线程化 emscripten 构建创建的 javascript 和 wasm 文件的复杂性,以及这些脚本由于 webpack 生成的文件重命名而造成的混乱。为多线程 emscipten 构建生成的文件是:

MyModule.js
MyModule.wasm
MyModule.worker.js

我可以(我认为)通过使用ModulelocateFile 方法使其在只有MyModule.jsMyModule.wasm 文件的非线程模式下工作。但是,由于引入了新的MyModule.worker.js 文件,系统变得非常混乱,MyModule.js 文件在 WebWorker 中自行启动。当然MyModule.worker.js 文件还需要找到并访问MyModule.wasm,这也会丢失(即由于 webpack 重命名而无法找到正确的文件名)。

不管怎样,我已经花了好几个小时在网上搜索任何像这样的成功用例,并尝试了可能的事情,包括手动编辑 MyModule.jsMyModule.worker.js 文件,但到目前为止没有任何运气。

有没有人成功地尝试过这样的事情,或者任何其他关于让多线程 emscripten/wasm 构建与 webpack(或 create-react-app)正常运行的建议?任何建议将不胜感激。

注意:这个问题不是关于在 web-worker 线程中运行 emscripten/webassembly 模块(尽管最后我将在 web-worker 中运行所有这些)。它专门关于多线程 emscripten 构建(即带有 pthreads 的 C++)启动并使用 webpack 正确运行。

【问题讨论】:

【参考方案1】:

在 Module 的 locateFile 中,您应该返回 MyModule.wasm 和 MyModule.worker.js 的正确路径。 此外,在 Module 的 mainScriptUrlOrBlob 中,您应该为 MyModule.js 分配路径。 mainScriptUrlOrBlob 在worker中用于加载wasm。

【讨论】:

以上是关于将 emscripten webassembly 线程 (C++) 与 webpack (create-react-app) 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

将 emscripten webassembly 线程 (C++) 与 webpack (create-react-app) 一起使用

2021-09-13 使用Emscripten 将c++编译为WebAssembly给JS调用

我可以以某种方式构建 webassembly 代码*没有* emscripten“胶水”吗?

OpenCV Find_Package Emscripten - WebAssembly

如何使用库导入编译 C 文件到 webassembly 文件(Emscripten)

如何表示来自 emscripten/webassembly 调用的 void* 返回