Почему при компиляции в WASM отсутствуют функции для ссылок на указатели? - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь начать компиляцию в WebAssembly из C ++ и, как правило, следую вместе с этим руководством , как передать данные изображения в код WASM. Я просмотрел через a несколько других сообщений, но я все еще довольно потерян. Всякий раз, когда я пытаюсь вызвать функцию, которая просматривает данные из JS, я получаю такие ошибки, как: missing function: _Z6getMatPdii (имя функции зависит от того, какой тип данных я создаю). Для конкретности соответствующие биты кода:

imageRead. cpp:

#include <armadillo>
#include <stdlib.h>

using namespace std;
using namespace arma;

extern "C" {

double* create_buffer(int width, int height) {

  return (double *)malloc(width * height * sizeof(double));

}

}

extern "C" {

void destroy_buffer(double* p) {

  free(p);

}

}

extern "C" {

mat getMat(double* p, int width, int height) {

  return  mat(p, height, width); // Armadillo constructor for matrix already in memory

}

}

и HTML:

var Module = {
...
 onRuntimeInitialized: function() {
          // API for preparing image transfers:
          api = {
            create_buffer: Module.cwrap('create_buffer','number',['number','number']),
            destroy_buffer: Module.cwrap('destroy_buffer','',['number']),
            fdtd: Module.cwrap('fdtd_sim',null,['number','number','number']),
          };

          p = api.create_buffer(img.width, img.height);
          Module.HEAP8.set(imageData,p);
...

и, наконец, fdtd_2d. cpp:

<header stuff>...
#include js_passing.h // Contains headers for imageRead.cpp functions

void fdtd_sim(double* p, int width, int height) {
  arma::mat image = getImage(p, width, height);
  ...do stuff...

и для компиляции:

emcc -o simulation.html obj/fdtd_2d.o obj/imageRead.o -Wall -std=c++14 -Lobj -s USE_SDL=2 -s WASM=1 -s NO_EXIT_RUNTIME=1 -s "EXTRA_EXPORTED_RUNTIME_METHODS=['cwrap']" -s ERROR_ON_UNDEFINED_SYMBOLS=0 -s ALLOW_MEMORY_GROWTH=1 -s SAFE_HEAP=1 -s EMULATE_FUNCTION_POINTER_CASTS=1 -s ASSERTIONS=1 -s "EXPORTED_FUNCTIONS=['_fdtd_sim','_create_buffer','_destroy_buffer']" -O2 -I /path/to/armadillo-code/include -lsuperlu_51 -DARMA_DONT_USE_WRAPPER

Как и в приведенном выше примере MDN, я получаю данные изображения от элемента <canvas>, который работает нормально, но всякий раз, когда я пытаюсь вызвать getMat, код завершается с ошибкой missing function: _Z6getMatPdii. Я по сути скопировал код MDN, поэтому я немного озадачен тем, почему он не работает.

При компиляции есть вывод, что _Z6getMatPdii не определен, но я не могу понять, где это Функция исходит от. Кроме того, я видел другие его версии, например _Z8getImgPhii (когда я использовал CImg, чтобы попытаться прочитать данные изображения).

Итак, мой вопрос: что здесь происходит? Очевидно, что это проблема с ссылками на указатели, но, если что-то и есть, я предполагаю, что некоторая библиотека не включена правильно, и поэтому функции конструктора отсутствуют, когда они должны быть. Если есть лучший способ сделать это, я весь в ушах. Последний вывод, который я пытаюсь получить - это arma::mat, в котором есть данные изображения в градациях серого из элемента canvas. То, как я туда попадаю, открыто для толкования.

...