c++ - 如何将 emscripten 与闭包工具结合使用

标签 c++ google-closure-compiler emscripten google-closure-library

为了获得最佳性能,我想将 emscripten 与闭包工具结合使用,但很遗憾,我无法从 emscripten 调用我在 JavaScript 中定义的函数。

请注意,我从我的项目中提取了一个最小的示例来证明我的意思。

// test.cc
#include <iostream>

#include "emscripten.h"

int main() {
  std::cout << "Hello, World!\n";
  EM_ASM(goog.dom.appendChild(
      document.body,
      goog.dom.createDom('p', {'font-weight' : 700}, 'Hello, World!'));
  );
}

所以“你好,世界!”打印正确但随后:

exception thrown: ReferenceError: goog is not defined,ReferenceError: goog is not defined

尽管 goog 自从我编译并包含闭包库以来就应该被定义,即使使用了高级优化,以便我获得最佳性能。

现在,如果我在 JavaScript 中做同样的事情,它会完全正常工作:

goog.provide('main');
goog.require('goog.dom');

console.log('Hello, World!');
goog.dom.appendChild(document.body, 
  goog.dom.createDom('p', {'font-weight': 700}, 'Hello, World!'));

顺便说一下,我将两者结合使用,并且我在 asmjs 文件之前包含了这个 JavaScript 文件,以确保真正定义了 goog

另一个需要注意的有趣的事情是,当我使用简单的优化进行编译时它确实有效。

那么如何将 emscripten 与闭包库和闭包编译器结合使用呢?

最佳答案

这是因为具有高级优化的闭包编译器会优化掉所有不需要的东西。

因此,需要将要调用的符号导出。

实际上,我会用 JavaScript 完成所有操作,然后导出单个符号,这样您就不必导出整个 goog.dom 命名空间:

goog.provide('asmjs');
goog.require('goog.dom');
/** @export */
asmjs.helloWorld = function() {
  goog.dom.appendChild(document.body, 
    goog.dom.createDom('p', {'font-weight': 700}, 'Hello, world!'));
};
goog.exportSymbol('asmjs.helloWorld', asmjs.helloWorld);

这样你就可以调用:

EM_ASM(asmjs.helloWorld(););

这应该按预期工作。

关于c++ - 如何将 emscripten 与闭包工具结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38625912/

相关文章:

c++ - 错误 C2511 : overloaded member function not found in Class

javascript - 在应用程序代码上运行 Google Closure Compiler 后更新 AngularJS 模板 HTML

javascript - 使用 Emscripten C++ Web Worker 高效传输大型数组 : which JavaScript design is better?

javascript - 将 asm 放入现有的 JS 应用程序中

c++ - 在 C++ 中命名和使用迭代器的常规约定是什么?

c++ - Flex4/AIR 与 NativeProcess : How to pass an image to the native process?

c++ - 复制构造函数、常量和右值

javascript - Google Closure Linter 在 Windows 的 Sublime Text 2 中不起作用

javascript - 无法使用点表示法获取值

node.js - 如何从 node.js 使用 WebAssembly?