emscripten - Emscripten 从 C 传递回调 - Runtime.getFuncWrapper - 未定义运行时
问题描述
我正在尝试运行此 Gist,但没有编译参数。我的尝试:
// file: pass_array.cpp
#include <cstdio>
extern "C" {
extern void initialize(void (*callback)(float*));
}
void callback(float* output)
{
for (int i = 0; i < 2; ++i)
{
output[i] = i+1;
}
printf("Callback was invoked\n");
}
int main()
{
initialize(&callback);
return 0;
}
// file: pass_array_library.js
// "use strict";
var LibraryTst = {
initialize: function (callback) {
callback = Runtime.getFuncWrapper(callback, 'vi') // error here
var numBytes = 2 * Float32Array.BYTES_PER_ELEMENT
var ptr = Module._malloc(numBytes)
try {
callback(ptr)
console.log('Callback filled buffer like so:')
var i = 0
for (i = 0; i < 2; ++i) {
console.log(HEAPF32[(ptr/Float32Array.BYTES_PER_ELEMENT)+i])
}
}
finally {
Module._free(ptr)
}
},
}
mergeInto(LibraryManager.library, LibraryTst)
编译:
emcc -O1 -Wall -Werror --bind -o pass_array.html --js-library pass_array_library.js pass_array.cpp
当我打开html时,我得到
pass_array.html:1 exception thrown: ReferenceError: Runtime is not defined,ReferenceError: Runtime is not defined
at _initialize (http://0.0.0.0:8000/pass_array.js:2119:7)
我错过了什么?
解决方案
首先看FAQ,Runtime
对象消失了,getFuncWrapper
应该直接调用函数:
callback = getFuncWrapper(callback, 'vi');
但库函数getFuncWrapper
也必须显式导出。它必须以 . 为前缀$
。有两种选择。要么通过命令行:
emcc --bind -o pass_array.html --js-library pass_array_library.js \
-s DEFAULT_LIBRARY_FUNCS_TO_INCLUDE=[\$getFuncWrapper] pass_array.cpp
($
在这里为 bash 转义)
或者,更好的是,声明为库的依赖项:
var LibraryTst = {
initialize: function (callback) { ... },
initialize__deps: ['$getFuncWrapper'], // !
}
推荐阅读
- jquery - 在 React 中动态构建渲染函数
- ios - 滚动时 didDeselectItemAt 崩溃
- javascript - 如何获取动态创建的下拉列表的值?
- gnuplot - 如何使用 Gnuplot 在一个图中绘制代表数据集中多个子集行的多个图表?
- python - Pandas 将使用逗号而不是小数点分隔符的数字从对象转换为数字
- r - 如何在 R 中使用配对列按列排列数据框?
- html - 更改显示给用户的结果中的字体
- ios - XCODE:iPhone 12 的尺寸将如何影响约束和情节提要?
- mysql - 计算来自同一列mysql的时间戳之间的时间差(以分钟为单位)
- c++ - 为什么要从“Class”转换为“Class*”?