【问题标题】:Emscripten module in browserify pipelinebrowserify 管道中的 Emscripten 模块
【发布时间】:2017-11-27 12:44:32
【问题描述】:

我正在尝试在我们的网站中添加一个 emscripten 编译模块。为了实现这一点,我正在使用 browserify(带有 babelify 转换)。

在创建 bundle 时出现问题:emscripten 代码被包装在生成的 js 文件中,但 Module 是一个空对象。代码实际上正在被解析,如下图所示:

长话短说:

import Module from "./main";
console.log(Module._int_sqrt(9));

返回此错误:

_main2.default._int_sqrt is not a function

我正在处理一些限制:无法将脚本直接添加到 html 页面。此构建步骤的输出必须是单个 js 文件,包括其所有依赖项。

我创建了一个最小的测试用例here,所以任何人都可以复制这个问题。

我将不胜感激这方面的任何指导,因为我认为这不是 emscripten 或 browserify 中的错误。

最后一点:源 cpp 代码可以正常工作。您可以运行用 mocha 编写的测试来检查它。

【问题讨论】:

  • 我在使用 uglify npm 模块时遇到了类似的问题,错误是我在 js 中有一个错误代码,结果是一个空文件,检查 js 文件,尤其是返回文字对象而不是 vars ,祝你好运
  • 如果你检查js文件,我只是导入模块,并打印导入结果。该错误与js本身无关。 emscripten 模块在节点环境中正确处理(如 mocha 测试演示)。问题来自 browserify 完成的自动捆绑,它检测环境是浏览器,因此我期望表现得像 nodejs 模块(将自身绑定到 module.exports 变量)
  • 我要做的是:1) 编译没有优化的模块 2) 检查使用 browserify 设置了哪些变量 3) 尝试查看编译模块中的流程 4) 变量是否正确?
  • 1) 未设置任何优化 2) 正在创建模块,并且实际调用了 run() 函数 3) 流程正确,直到需要 invokes the "main" file (由 "5" 引用) 4 ) 变量是正确的,但是它们被评估的闭包丢失了

标签: gulp browserify amd emscripten


【解决方案1】:

感谢 emscripten 工具的贡献者,我能够找到解决方案。

如果在emcc编译阶段添加编译标志-s MODULARIZE=1,问题就解决了。然后,在 js 代码中,创建一个 Module 的实例。该实例将具有可访问的功能。

js 代码应该是这样的:

import Module from "./main";

let m = new Module();
console.log(m._int_sqrt(9))

我已更新the test case,以防有人想查看

【讨论】:

    【解决方案2】:

    如果我强制 Emscripten Module.ENVIRONMENT = 'NODE',Browserify 会生成一个在 Chrome 中对我有用的输出。这可以通过两种方式完成:

    1. 在运行 browserify 之前将 var Module = { ENVIRONMENT: 'NODE' }; 添加到 Emscripten Javascript 输出中。
    2. 使用 emcc 的 --pre-js <file> 选项,文件包含与上述 1 中相同的代码。

    【讨论】:

    • 我收到了Uncaught ReferenceError: Module is not defined ;c
    猜你喜欢
    • 2014-01-03
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多