首页 > 解决方案 > 为什么编译为 WASM 时缺少引用指针的函数?

问题描述

我正在尝试开始从 C++ 编译到 WebAssembly,并且通常会遵循本指南来了解如何将图像数据传递给 WASM 代码。我浏览 了其他 一些帖子,但我仍然很迷茫。每当我尝试调用一个查看来自 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我如何到达那里可以解释。

标签: c++cwebassemblyemscripten

解决方案


推荐阅读