如何将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!'));
);
}
所以"你好,世界!"是正确打印的,但随后:
exception thrown: ReferenceError: goog is not defined,ReferenceError: goog is not defined
即使CCD_ 1在我编译并包含闭包库之后就应该定义了,即使使用了高级优化,这样我也可以获得最大的性能。
现在,如果我在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(););
这应该如预期的那样工作。
相关文章:
- 多态性和功能结合
- 使用外部SDK工具链文件在VisualStudio上生成项目编译错误
- 在clang++预处理器中确定gcc工具链版本
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 参数化自定义CMake工具链
- 如何在QT中的自定义视频小工具t上绘制矩形
- 使用 C++ 和 i2c 工具从虚拟 i2c 写入和读取
- 将 Vulkan 与 SFML 结合使用?
- 用于C++的静态二进制检测或二进制重写工具和框架
- 在OSX上使用CMake将Adobe的XMP工具包构建为共享库的最简单方法是什么?
- 将 c++ 生成器应用程序与外部 dll 结合使用
- AWS IoT 开发工具包:通过 TCP 端口 443 使用 MQTT
- 在官方张量流 resnet50 模型上运行 tflite 精度工具
- 如何将增强MSM与增强信号结合使用?
- Q没有管理权限的 exe 无法启动维护工具
- C++合并排序可视化工具
- 为Bazel工具链指定sysroot
- MS Visual Studio 解决方案结合了非托管C++项目和 C# 项目
- 在自动工具中包含用于不同bin_Programs的不同库
- 如何将emscripten与闭包工具结合使用