3

Для оптимальной производительности я хотел бы использовать emscripten в сочетании с инструментами закрытия, но плохо я не могу назвать функцию, определенную в JavaScript из emscripten.Как использовать 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();); 

, который должен работать должным образом.