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();); 

它應該按預期工作。

相關問題