标签: webassembly

"断言失败:您需要等待运行时准备好"在JavaScript中调用C函数时出错

我正在尝试一个简单的例子,用JavaScript调用编译为.wasm的C函数.

这是counter.c文件:

#include <emscripten.h>

int counter = 100;

EMSCRIPTEN_KEEPALIVE
int count() {  
    counter += 1;
    return counter;
}
Run Code Online (Sandbox Code Playgroud)

我用它编译了它emcc counter.c -s WASM=1 -o counter.js.

我的main.jsJavaScript文件:

const count = Module.cwrap('count ', 'number');
console.log(count());
Run Code Online (Sandbox Code Playgroud)

我的index.html文件只加载正文中的两个.js文件,没有别的:

<script type="text/javascript" src="counter.js"></script>
<script type="text/javascript" src="main.js"></script>
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

Uncaught abort("Assertion failed: you need to wait for the runtime to be ready (e.g. wait for main() to be called)") at Error

当我试着打电话count()的时候main.js.我怎么能等待运行时准备好?

javascript emscripten webassembly

9
推荐指数
1
解决办法
1969
查看次数

如何从C/C++访问WebAssembly线性内存

我正在编写一个小型C程序,旨在编译为ism w/emcc并在Web浏览器中运行.因为wasm导出的函数只能接受简单的数值作为参数输入和返回值,所以我需要在JavaScript API和编译的WebAssembly代码之间共享内存,以便访问更复杂的数据类型,如字符串或char数组.问题是我不能为我的生活弄清楚如何从我的C程序内部访问WebAssembly线性内存.

我的最终目标是能够在我的C程序中读取在JavaScript中初始化的字符串,然后在Web浏览器的JavaScript代码中读取在我的C程序中修改/初始化的字符串.

这是我正在尝试做的基本示例:

main.js

const importObject = {
  'env': {
    'memoryBase': 0,
    'tableBase': 0,
    'memory': new WebAssembly.Memory({initial: 256}),
    'table': new WebAssembly.Table({initial: 0, element: 'anyfunc'})
  }
}

// using the fetchAndInstantiate util function from
// https://github.com/mdn/webassembly-examples/blob/master/wasm-utils.js
fetchAndInstantiate('example.wasm', importObject).then(instance => {

      // call the compiled webassembly main function
      instance.exports._main()
      console.log(importObject.env.memory)
})
Run Code Online (Sandbox Code Playgroud)

example.c

int main() {
    // somehow access importObject.env.memory 
    // so that I can write a string to it
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这个问题让我成为了那里的一部分,但是,我仍然不明白如何从我的C代码中的WebAssembly内存缓冲区读/写.

emscripten webassembly

9
推荐指数
1
解决办法
2702
查看次数

如何在 JetBrains CLion 中使用 `cmake` 来编译 Emscripten/WebAssembly?

我正在尝试正确设置JetBrains CLion 2019.1以从C源代码构建WebAssembly。我几乎尝试了所有方法,但是,没有任何效果。我没有得到任何WebAssembly构建。我得到的是:

  • WasmText.js
  • WasmTest.js.mem
  • WasmTest.cbp

当我em++ main.cpp -o out/index.html -s WASM=1 -O3在命令行上运行时,我实际上得到了

  • index.html
  • index.js
  • index.wasm

结果的尺寸也小得多。

我已经使用以下设置设置了构建、执行、部署-> CMake配置:

构建类型

最小相对

工具链

使用默认值:系统

(我曾尝试使用 emscripten sdk 设置我自己的工具链,但是,CLion 对设置执行了一些测试,并抱怨它无法使用em++.

CMake 选项

$EMSCRIPTEN_ROOT$在 CLion 中设置了一个路径变量。我可以确认它可以正常工作,将它传递${EMSCRIPTEN_ROOT}CMakeLists.txtas 参数。

-DCMAKE_TOOLCHAIN_FILE=${EMSCRIPTEN_ROOT}/cmake/Modules/Platform/Emscripten.cmake
-G"Unix Makefiles"
--debug-output
Run Code Online (Sandbox Code Playgroud)

环境

EMSDK=/wrk/dev/emsdk
EMSCRIPTEN=/wrk/dev/emsdk/emscripten/1.37.12
EMSDK_NODE=/wrk/dev/emsdk/node/4.1.1_64bit/bin/node
LLVM_ROOT=/wrk/dev/emsdk/clang/e1.37.12_64bit
BINARYEN_ROOT=/wrk/dev/emsdk/clang/e1.37.12_64bit/binaryen
EMSCRIPTEN_NATIVE_OPTIMIZER=/wrk/dev/emsdk/clang/e1.37.12_64bit/optimizer
EM_CONFIG=/home/webmaster/.emscripten
PATH=/wrk/dev/emsdk:/wrk/dev/emsdk/clang/e1.37.12_64bit:/wrk/dev/emsdk/node/4.1.1_64bit/bin:/wrk/dev/emsdk/emscripten/1.37.12:/bin:/usr/bin:/usr/lib/bin
Run Code Online (Sandbox Code Playgroud)

构建选项

-j 2

(字段为空时自动设置)

源文件

#include <iostream>

int main()
{
  std::cout << …
Run Code Online (Sandbox Code Playgroud)

c++ cmake emscripten clion webassembly

9
推荐指数
1
解决办法
2404
查看次数

是否可以将 Web Assembly (wasm) 文件反编译为特定的编程语言?

目前大多数编程语言,都可以编译成 WebAssembly(官方或者通过外部包)。

所以我想知道......是否可以反编译Web程序集文件?那么我们可以用一种语言编写的代码可以编译为.wasm,并使用另一种语言反编译它?然后,生成.java.js.py.go和等,从.wasm文件。是否可以?

webassembly

9
推荐指数
3
解决办法
8650
查看次数

在 Chrome 中调试 WebAssembly

我是 WebAssembly 的新手,但我已经使用它和 Emscripten 大约一个月了,并且对最小的构建工具包相当熟悉。

在调试方面,我发现我找不到如何充分利用 Chrome 和 Firefox 环境。

在 Firefox 68.0.1 中,我的 Source Map 文件加载,我可以将它们正确映射到我的 C/C++ 源文件。

但是,我无法看到本地堆栈。我可以看到所有的局部变量,但是当我逐步执行我的 wasm 代码时,当 FF 显示它时,它将事物推送到我看不到的堆栈中,并且手动跟踪它是一种痛苦。

相比之下,Chrome 76 给了我堆栈,让我添加 Source Map 来查看我的 C/C++ 引用,但我无法让它给我任何类型的 wasm 代码来逐步完成,要么是我自己的垃圾文件,要么自己的拆解版。

我从节点 http-server 或 emscripten emrun 加载的所有 wasm 在 DevTools 的“Sources”选项卡中向我展示了我的源代码,但在 localhost 下还有一个标记为“top/(无域)”的节点。我试过加载一个简单的模块但没有成功。

简单的你好世界演示

我想弄清楚如何在 FireFox 中查看本地堆栈或让 Chrome 向我展示 wasm 反汇编(最好是两者)。Chrome 似乎为 WebAssembly Studio 这样做,我不知道为什么

在此处输入图片说明

google-chrome-devtools emscripten firefox-developer-tools webassembly

9
推荐指数
0
解决办法
794
查看次数

如何满足 wasm 的严格 mime 类型检查?

我得到了一个使用 emscripten 编译的 webassembly 模块。现在我正在尝试使用 expressjs 在网页中提供它。

我已经尝试按照这个要点来通过 webpack 包含 webassembly,包括我发现的一个修改,因为这个要点有点旧。

webpack 看起来像这样:

const path = require('path');

module.exports = {
  optimization: {
    mangleWasmImports: false
  },
  entry: './src/index.js',
  output: {
    path: path.resolve(__dirname, './dist/'),
    filename: 'dynamic-graph.bundle.js'
  },
  target: "web",
  module: {
    rules: [
      // Emscripten JS files define a global. With `exports-loader` we can 
      // load these files correctly (provided the global’s name is the same
      // as the file name).
      {
        test: /fourd\.js$/,
        loader: "exports-loader"
      },
      // wasm files …
Run Code Online (Sandbox Code Playgroud)

browser webpack server webassembly

9
推荐指数
1
解决办法
1124
查看次数

将现有的 C# 代码编译为 WebAssembly

是否可以将现有的 C# 代码编译为 WebAssembly (.wasm),以便无需或几乎无需更改代码?
我必须为此使用 Blazor 还是其他可能性?

c# webassembly blazor blazor-webassembly

9
推荐指数
2
解决办法
3032
查看次数

Go WASM 导出函数

我想创建一个.wasm文件,该文件仍然具有编译时导出的函数名称。

package main

import (
    "fmt"
)

func main() {
    fmt.Println("Main")
}

func MyFunc() {
    fmt.Println("MyFunc")
}

Run Code Online (Sandbox Code Playgroud)

我正在建设

GOOS=js GOARCH=wasm go build -o main.wasm
Run Code Online (Sandbox Code Playgroud)

它会生成 wasm 文件(Go 本身就以 wasm 为目标,这真是太棒了)。

但是使用wabt并进行对象转储会公开这些函数。

Export[4]:
 - func[958] <wasm_export_run> -> "run"
 - func[959] <wasm_export_resume> -> "resume"
 - func[961] <wasm_export_getsp> -> "getsp"
 - memory[0] -> "mem"
Run Code Online (Sandbox Code Playgroud)

我期待看到类似的东西

func[137] <MyFunc> -> "MyFunc"
Run Code Online (Sandbox Code Playgroud)

有谁知道如何在 Go WASM 中导出函数?

在 Rust 中,包含#[no_mangle]pub extern "C" 保持该功能在 wasm-pack 的输出中可用。我正在寻找与 Go 类似的东西。

go webassembly

9
推荐指数
1
解决办法
3426
查看次数

如何在 WASM (Rust) 中导入 WASM 模块并传递 String 参数

我想按照这个 js-sys 示例从 Wasm 模块内部实例化 Wasm 模块。在示例中,add调用的函数传递 i32 参数。

我创建了一个 hello world 函数,它接受一个字符串作为参数并返回一个字符串。但是,调用此函数不起作用,因为它返回未定义。

通常,wasm bindgen 会生成粘合代码,该代码创建上下文并将字符串放入堆栈中。然而,Rust 不会生成这样的代码。

如何hello在 Rust 中加载并执行 Wasm 中的函数?

导入的_lib.rs
use wasm_bindgen::prelude::*;

#[wasm_bindgen]
pub fn add(a: i32, b: i32) -> i32 {
 a + b
}

#[wasm_bindgen]
pub fn hello(name: String) -> String {
 format!("hello {:?}", name).into()
}
Run Code Online (Sandbox Code Playgroud)
main_lib.rs
use js_sys::{Function, Object, Reflect, WebAssembly};
use wasm_bindgen::prelude::*;
use wasm_bindgen::JsCast;
use wasm_bindgen_futures::{spawn_local, JsFuture};

// lifted from the `console_log` example
#[wasm_bindgen]
extern "C" { …
Run Code Online (Sandbox Code Playgroud)

rust webassembly wasm-bindgen

9
推荐指数
1
解决办法
4289
查看次数

webAssembly:无需 JavaScript 即可与浏览器交互

是否有一个 WebAssembly API 允许 WebAssembly 代码在没有 JavaScript 的情况下与浏览器交互?例如,访问网络、DOM 和 OpenGL。特别是对于 OpenGL,我必须首先通过 JavaScript 进行每个函数调用,这很荒谬。与此相关的必然是巨大的性能损失。

如果没有,是否有此类 API 的计划?

webassembly

8
推荐指数
1
解决办法
2758
查看次数