如何将 emscripten 与闭包工具结合使用
How to use emscripten in conjunction with the closure tools
为了获得最佳性能,我想将 emscripten 与闭包工具结合使用,但很遗憾,我无法从 emscripten 调用我在 JavaScript 中定义的函数。
请注意,我从我的项目中提取了一个最小的示例来证明我的意思。
// 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
。
另一个值得注意的有趣的事情是,当我使用简单的优化进行编译时它确实有效。
那么如何将 emscripten 与闭包库和闭包编译器结合使用呢?
这是因为具有高级优化功能的闭包编译器会优化所有不需要的东西。
因此,您需要将要调用的符号导出。
我实际上会在 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(););
这应该会按预期工作。
为了获得最佳性能,我想将 emscripten 与闭包工具结合使用,但很遗憾,我无法从 emscripten 调用我在 JavaScript 中定义的函数。
请注意,我从我的项目中提取了一个最小的示例来证明我的意思。
// 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
。
另一个值得注意的有趣的事情是,当我使用简单的优化进行编译时它确实有效。
那么如何将 emscripten 与闭包库和闭包编译器结合使用呢?
这是因为具有高级优化功能的闭包编译器会优化所有不需要的东西。
因此,您需要将要调用的符号导出。
我实际上会在 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(););
这应该会按预期工作。