Я пытаюсь начать компиляцию в 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
. То, как я туда попадаю, открыто для толкования.