Emscripten 从 C 传递回调 - Runtime.getFuncWrapper - 未定义运行时

Emscripten passing callback from C - Runtime.getFuncWrapper - Runtime is not defined

我正在尝试 运行 this 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)

我错过了什么?

首先看FAQRuntime对象消失了,应该直接调用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'],  // !
}