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

C++ 如何将emscripten与闭包工具结合使用,c++,google-closure-compiler,emscripten,google-closure-library,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(

为了获得最佳性能,我希望将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!'));
  );
}
尽管自从我编译并包含闭包库后,就应该定义
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(););
这应该像预期的那样起作用

EM_ASM(asmjs.helloWorld(););