#emscripten
#emscripten
Вопрос:
Я пытаюсь запустить эту суть, но без параметров компиляции. Моя попытка:
// 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 invokedn");
}
int main()
{
initialize(amp;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)
Чего мне не хватает?
Ответ №1:
Прежде всего, глядя на 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'], // !
}