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

「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が実際に定義されています。

注目すべきもう1つの興味深い点は、単純な最適化でコンパイルすると実際に機能することです。

したがって、私はclosureライブラリとclosureコンパイラと一緒に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();); 

期待どおりに動作するはずです。

関連する問題