3

Für eine optimale Leistung möchte ich emscripten in Verbindung mit den Closure Tools verwenden, aber schlecht kann ich die Funktion, die ich in JavaScript definiert habe, nicht von emscripten aufrufen.Wie benutze ich emscripten in Verbindung mit den Closure Tools

Beachten Sie, dass ich ein minimales Beispiel aus meinem Projekt extrahiert habe, demonstriere, was ich meine.

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

Also "Hallo, Welt!" da ich die maximale Leistung haben

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

obwohl goog sollte so die Schließung Bibliothek auch mit erweiterten Optimierungen enthalten definiert habe kompiliert und ich: richtig, aber dann wird gedruckt.

Nun, wenn ich die gleiche Sache in JavaScript zu tun funktioniert es völlig in Ordnung:

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

Durch die Art, wie ich beide in Verbindung mit bin und ich schließe diese Datei JavaScript bevor die asmjs nur um sicherzugehen, dass Datei goog ist wirklich definiert.

Eine andere interessante Sache zu beachten ist, dass es tatsächlich funktioniert, wenn ich mit einfachen Optimierungen kompiliere.

Also, wie kann ich emscripten in Verbindung mit der Schließung Bibliothek und Schließung Compiler?

Antwort

2

Dies liegt daran, dass der Abschlusscompiler mit erweiterten Optimierungen alles, was nicht benötigt wird, optimiert.

Daher müssen Sie die Symbole exportieren, die Sie aufrufen möchten.

Ich würde eigentlich die ganze Sache in JavaScript tun und dann ein einzelnes Symbol exportieren, so dass Sie den gesamten goog.dom Namensraum nicht exportiert werden müssen:

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

So können Sie dann rufen:

EM_ASM(asmjs.helloWorld();); 

, die wie erwartet funktionieren sollte.