断言失败:在 .js 文件 (emscripten) 中调用 c 函数时,在运行时初始化错误之前调用了本机函数 `int_sqrt`

Posted

技术标签:

【中文标题】断言失败:在 .js 文件 (emscripten) 中调用 c 函数时,在运行时初始化错误之前调用了本机函数 `int_sqrt`【英文标题】:Assertion failed: native function `int_sqrt` called before runtime initialization error while calling c function in .js file ( emscripten ) 【发布时间】:2020-08-18 11:34:06 【问题描述】:

我无法在另一个 javascript 文件中调用 C 函数,它给出了错误“在运行时初始化之前调用”please refer to this link

我按照给定链接中的说明在 emscripten 中编译了 C 代码,并在我的 test.js 文件中使用了生成的 asm.js 文件。 用于生成 asm 的命令:-

emcc test/hello.cpp -o hello.html -s EXPORTED_FUNCTIONS="['_int_sqrt']" -s EXPORTED_RUNTIME_METHODS="["ccall", "cwrap"]"

test.js 文件中的代码:

var Module = require('./asm.js');
var test =  Module.cwrap('int_sqrt', 'number', ['number']);
console.log(test(25));

当我运行 node test 时,它给出了错误

abort(Assertion failed: native function `int_sqrt` called before runtime initialization)

【问题讨论】:

【参考方案1】:

您应该等待运行时初始化。 试试这个:

var Module = require("./lib.js");
var result = Module.onRuntimeInitialized = () => 
    Module.ccall('myFunction', // name of C function 
        null, // return type
        null, // argument types
        null // arguments
   );

【讨论】:

最终,我得到了答案,我想如果我们在编译时添加 WASM = 0 标志,那么我们可能不会等待运行时初始化。非常感谢您的回答先生。【参考方案2】:

我在使用 emscripten 时遇到了同样的问题,这对我有用:

<script>
    Module.onRuntimeInitialized = () =>  Module.functionName(param); 
</script>

其中 functionName 是您要调用的函数的名称,param 是您要传递给它的值。

【讨论】:

以上是关于断言失败:在 .js 文件 (emscripten) 中调用 c 函数时,在运行时初始化错误之前调用了本机函数 `int_sqrt`的主要内容,如果未能解决你的问题,请参考以下文章

Emscripten: emmake 生成 .js 文件

将文件名传递给 Emscripten 生成的 js 作为参数

我应该在 JS 中哪里定义 emscripten extern 函数?

使用 emscripten 生成 python.cc.js

如何在 React 中使用 Emscripten JavaScript 文件

如何使用 emscripten 将文件从 C 保存到浏览器存储