3

为了获得最佳性能,我想将emscripten与闭包工具结合使用,但效果不佳,我无法调用我从emscripten在JavaScript中定义的函数。如何将emscripten与闭包工具一起使用

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

// 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!')); 

通过我使用这两种结合的方式,我加入此JavaScript文件之前asmjs文件只是为了确保goog是真正定义的。

另一个有趣的事情要注意的是,当我用简单的优化进行编译时,它实际上工作。

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

回答

2

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

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

其实我做整个事情的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();); 

它应该按预期工作。

相关问题