WebAssembly LinkError:函数导入需要可调用对象



我最近开始使用WebAssembly。我在尝试在 C 代码中使用日志时遇到问题。我以最简单的方式重新创建了错误。我得到的错误是

Uncaught (in promise) LinkError: WebAssembly.Instance(): Import #1 module="env" function="_log" error: function import requires a callable

错误指向此函数,特别是WebAsembly.Instance(module, imports)

function loadWebAssembly(filename, imports = {}) {
  return fetch(filename)
    .then((response) => response.arrayBuffer())
    .then((buffer) => WebAssembly.compile(buffer))
    .then((module) => {
      imports.env = imports.env || {}
      Object.assign(imports.env, {
        memoryBase: 0,
        tableBase: 0,
        memory: new WebAssembly.Memory({
          initial: 256,
          maximum: 512,
        }),
        table: new WebAssembly.Table({
          initial: 0,
          maximum: 0,
          element: 'anyfunc',
        }),
      })
      return new WebAssembly.Instance(module, imports)
    })
}

(我用loadWebAssembly('/test.wasm')调用这个函数(

我的 C 代码是

#include <math.h>
double test(v) {
  return log(v)
}

并且在编译时使用时不会出错

emcc test.c -Os -s WASM=1 -s SIDE_MODULE=1 -o test.wasm

无法修复此错误,希望有人可以帮助我。

您没有提供log()的实现imports.env

Object.assign(imports.env, {
    memoryBase: 0,
    tableBase: 0,
    memory: new WebAssembly.Memory({
        initial: 256,
        maximum: 512,
    }),
    table: new WebAssembly.Table({
        initial: 0,
        maximum: 0,
        element: 'anyfunc',
    }),
    _log: Math.log,
})

我可能是错的,但我认为你的 C 代码是错误的

默认情况下,emscripten 仅导出其他函数main为死代码

您需要告诉emscripten使用宏EMSCRIPTEN_KEEPALIVE保持test函数的活动

并且不要忘记包含头文件emscripten/emscripten.h

有关更多信息,请访问此链接

测试.c

#include <stdio.h>
#include <emscripten/emscripten.h>
#include <math.h>
EMSCRIPTEN_KEEPALIVE
double test(double x)
{
    return log(x);
}

你可以在 js 中访问你的函数

JavaScript

loadWebAssembly('test.wasm')
    .then((data) => {
        console.log(data.exports) // {__wasm_call_ctors: ƒ, log10: ƒ}
    }).
    catch((err) => {
        console.log(err);
    });

相关内容

  • 没有找到相关文章

最新更新