c++ - 为什么编译为 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
我如何到达那里可以解释。
解决方案
推荐阅读
- javascript - 无法在nodejs es6字符串的url中加载动态变量值
- r - Rmd 不会在 RStudio 中编织
- c++11 - 为什么c++11 unordered_multimap中有这么多桶?
- wpf - Xaml 中的 WPF .Net Core 3.0 映射语言基元类型
- angular - package.json 以相同的配置依次运行多个命令
- r - 如何摆脱r中表格前的空白行?
- sap - 具有 CLOB 输出参数的 SAP HANA 动态分析特权过程不起作用
- javascript - 此代码有效吗?如果是,那么在 consol 上显示错误
- java - 如何处理 TCP 消息绞盘是分段的
- pandas - 如果日期格式通过列逐渐变化,如何转换为日期时间?