标签: rust-wasm

生成返回字符串的函数时,为什么 wasm-opt 在 wasm-pack 构建中失败?

我正在为康威的生命游戏学习 Rust WASM 教程

调用文件中最简单的函数之一Universe.render(它用于渲染表示游戏状态的字符串)。当我运行时它会导致错误wasm-pack build

Fatal: error in validating input
Error: failed to execute `wasm-opt`: exited with exit code: 1
  full command: "/home/vaer/.cache/.wasm-pack/wasm-opt-4d7a65327e9363b7/wasm-opt" "/home/vaer/src/learn-rust/wasm-game-of-life/pkg/wasm_game_of_life_bg.wasm" "-o" "/home/vaer/src/learn-rust/wasm-game-of-life/pkg/wasm_game_of_life_bg.wasm-opt.wasm" "-O"
To disable `wasm-opt`, add `wasm-opt = false` to your package metadata in your `Cargo.toml`.
Run Code Online (Sandbox Code Playgroud)

如果我删除该函数,则代码构建时不会出错。如果我用以下函数替换它,构建将失败并出现相同的错误:

pub fn wtf() -> String {
    String::from("wtf")
}
Run Code Online (Sandbox Code Playgroud)

似乎任何返回 a 的函数都会String导致此错误。为什么?

以下是我的全部代码:

mod utils;

use wasm_bindgen::prelude::*;

// When the `wee_alloc` feature is enabled, use `wee_alloc` as the global
// …
Run Code Online (Sandbox Code Playgroud)

rust webassembly wasm-bindgen wasm-pack rust-wasm

11
推荐指数
1
解决办法
1252
查看次数

为什么 Rust WASM 在计算素数时比 JavaScript 慢

我编写了一段非常基本的代码来计算 Rust(编译为 WASM)和 JavaScript 中的数字是否为素数,以对算术性能进行基准测试。

我满心期待 Rust/WASM 能够打败 JavaScript。在我做过的所有其他算术基准测试中,Rust/WASM 似乎比 JavaScript 更有优势,或者至少与之匹配。然而,在这个测试中,JavaScript 似乎远远优于 WASM,我并没有真正解释为什么会这样。

生锈代码:

pub fn calculate_is_prime(number: u64) -> bool {
    if number == 1 {
        return false;
    }
    if number == 2 {
        return true;
    }
    for i in 2..number {
        if number % i == 0 {
            return false;
        }
    }
    return true;
}

#[wasm_bindgen]
pub fn bench_rs(max: u64) -> u64 {
    (1..=max).map(|n| calculate_is_prime_rs(n) as u64).sum()
}
Run Code Online (Sandbox Code Playgroud)

JavaScript 代码:

function calculateIsPrime(number) {
    if (number === 1) { …
Run Code Online (Sandbox Code Playgroud)

javascript performance rust webassembly rust-wasm

10
推荐指数
1
解决办法
1584
查看次数

Why is bubble sort faster when implemented in JavaScript then when implemented in Wasm using Rust?

I wrote the bubble sort algorithm in JavaScript and Wasm using Rust and the JS code is faster than Rust code. How is this possible?

JavaScript code

import * as wasm from "wasm-comparision-sort-algorithms";

function main() {
  const arr = generateRandomArray({size: 50000, min: 1, max: 1000})
  const arr2 = [...arr]
  console.time("Bubble Sort JS")
  bubbleSort(arr)
  console.timeEnd("Bubble Sort JS")
  wasm.handle_bubble_sort(arr2)
}

/**
 * Algorithm to sort an array of numbers using the bubble sort algorithm.
 * @param {Number[]} arr - The array of …
Run Code Online (Sandbox Code Playgroud)

javascript algorithm bubble-sort rust rust-wasm

7
推荐指数
0
解决办法
410
查看次数

Rust 的 WASM 未返回预期类型

嘿@all,我正在使用WebAssembly Studio并创建了一个空的 Rust 项目。

在我的 Rust 代码中,我返回“Hello World”字符串的指针和长度。编译工作正常,但我期望生成的 WASM 有一个返回两个 i32 的函数。但我发现一个函数接受一个 i32 并且没有返回任何内容。

  1. 为什么该函数没有签名 fn () -> (i32,i32) ?

  2. 我该如何从 WASM 模块中提取这两个值?(使用 Rust- wasmtime

您可以在下面找到我正在讨论的代码片段。提前致谢!

#[no_mangle]
pub extern "C" fn say() -> (*const u8,i32)  {
    let pointcut = "Hello World";

    (pointcut.as_ptr(),11)
}
Run Code Online (Sandbox Code Playgroud)
(module
  (type $t0 (func (param i32)))
  (func $say (export "say") (type $t0) (param $p0 i32)
    get_local $p0
    i32.const 11
    i32.store offset=4
    get_local $p0
    i32.const 1024
    i32.store)
  (table $T0 1 1 anyfunc)
  (memory $memory (export …
Run Code Online (Sandbox Code Playgroud)

rust webassembly rust-wasm

7
推荐指数
1
解决办法
1067
查看次数

如何列出此 WASM 模块中的符号?

我希望使用 good-ol'FFmpeg和 Rust 来做一些浏览器内的视频工作。调用者与 ffmpeg 命令行交互的简单示例比比皆是。更复杂的例子更难找到。就我而言,我希望提取、处理和旋转离散帧。

Clipchamp对 WASM 和 的使用令人印象深刻FFmpeg,但是下载的 WASM 文件(只有一个)不会向wasm-nmNor透露自己wasm-decompile,两者都抱怨相同的操作码:

有谁能分享我如何(1)反思正在使用的 WASM 模块或(2)更一般地建议我如何(最有可能使用 WASM 和 Rust)处理视频文件?

ffmpeg webassembly rust-wasm

6
推荐指数
1
解决办法
952
查看次数

“HashMap<i32, i32>”未实现特征“IntoWasmAbi”

尝试编译以下rust代码以wasm使其与现有js兼容运行。尝试从函数返回哈希映射值。

库文件

    use wasm_bindgen::prelude::*;
    use std::collections::HashMap;

   #[wasm_bindgen]
    pub fn get_transformed_filters()-> HashMap<i32, i32> { 
        let mut hm = HashMap::new();
        for i in 1..9990000 {
            hm.insert(i + i, i * i);
        }  
        return hm 
    }
Run Code Online (Sandbox Code Playgroud)

运行命令后控制台错误wasm-pack build

[INFO]:   Checking for the Wasm target...
[INFO]:   Compiling to Wasm...
   Compiling hello-wasm v0.1.0 (/Users/mfe/ui/rustService/test-wasm)
error[E0277]: the trait bound `HashMap<i32, i32>: IntoWasmAbi` is not satisfied
  --> src/lib.rs:15:1
   |
15 | #[wasm_bindgen]
   | ^^^^^^^^^^^^^^^ the trait `IntoWasmAbi` is not implemented for `HashMap<i32, …
Run Code Online (Sandbox Code Playgroud)

rust rust-cargo webassembly wasm-bindgen rust-wasm

5
推荐指数
0
解决办法
3962
查看次数

使用 WebAssembly 在 Rust 中进行单元测试

WASM我正在使用该框架编写前端seed

我想用单元测试来测试我的模块之一,但我无法让它们来测试WASM代码。这是我的测试套件:

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn check_non_wasm() {
        assert_eq!("test", "test");
    }

    #[test]
    fn check_home() {
        assert_eq!(Urls::new().home().to_string(), "/");
    }
}
Run Code Online (Sandbox Code Playgroud)

第一个测试通过了,因为没有使用任何与WASM. 另一个测试失败并出现以下错误:

thread 'urls::tests::check_home' panicked at 'cannot call wasm-bindgen imported functions on non-wasm targets'
Run Code Online (Sandbox Code Playgroud)

如果我运行cargo make test --chrome它甚至看不到这些测试。
我尝试运行cargo test --target wasm32-unknown-unknown,但失败并出现以下错误:

could not execute process `C:\Users\djenty\w\frontend\target\wasm32-unknown-unknown\debug\deps\w_frontend-2b6de747c6501f70.wasm` (never executed)
Run Code Online (Sandbox Code Playgroud)

rustup显示目标已安装:

installed targets for active toolchain
--------------------------------------

wasm32-unknown-unknown
x86_64-pc-windows-msvc

active toolchain
----------------

stable-x86_64-pc-windows-msvc (default)
rustc 1.54.0 …
Run Code Online (Sandbox Code Playgroud)

unit-testing rust webassembly wasm-bindgen rust-wasm

5
推荐指数
0
解决办法
697
查看次数

编译将 C++ 调用到 WASM 的 Rust

我发现了这个How do I use a C library in a Rust library generated to WebAssembly? ,但这依赖于 wasm-merge,该功能已停止使用。我的问题如下,我有一些 C++ 代码,我想从 Rust 调用它们,以便可以选择将生成的包编译为在移动应用程序中使用的本机代码或在 Node.js 中使用的 WebAssembly。目前,我有以下设置:

libTest.cpp

extern "C"{
    int test_function(int i){
        return i;
    }
}
Run Code Online (Sandbox Code Playgroud)

库文件

use wasm_bindgen::prelude::*;

#[link(name = "Test")]
extern "C"{
    pub fn test_function(i: i32) -> i32 ;
}

#[wasm_bindgen]
pub fn test_function_js(i : i32) -> i32{
    let res = unsafe{test_function(i)};
    res
}    
Run Code Online (Sandbox Code Playgroud)

构建.rs

fn main() {
    cc::Build::new()
        .cpp(true)
        .file("libTest.cpp")
        .compile("libTest.a");
}
Run Code Online (Sandbox Code Playgroud)

当使用简单的编译为本机代码时,它可以编译并工作cargo build,但不适用于我正在做的构建到 wasm …

c++ ffi rust webassembly rust-wasm

5
推荐指数
1
解决办法
1412
查看次数

调用从 Wasmtime 返回字符串的 WASM 函数

在较高级别上,我尝试创建一个 Rust 主机程序,该程序在运行时使用 Wasmtime 加载 WASM 模块并调用返回字符串的 WASM 函数。我可以使用数字类型(例如 )来实现此功能usize,但无法弄清楚如何处理字符串(或其他复杂类型)。

在我的插件箱中,我有一个lib.rs编译用的cargo build --target=wasm32-unknown-unknown --release

use std::ffi::CString;
use std::os::raw::c_char;

static PLUGIN_NAME: &'static str = "Test Plugin";

#[no_mangle]
pub extern "C" fn plugin_name() -> *mut c_char {
    let s = CString::new(PLUGIN_NAME).unwrap();
    s.into_raw()
}

#[no_mangle]
pub fn plugin_name_len() -> usize {
    PLUGIN_NAME.len()
}
Run Code Online (Sandbox Code Playgroud)

这是基于这个问题的答案之一中的代码,该代码与我正在寻找的内容很接近,但在主机端使用 JavaScript。

在我的主机箱中我有一个main.rs

use wasmtime::{Engine, Linker, Module, Store};
use wasmtime_wasi::WasiCtxBuilder;

fn main() -> anyhow::Result<()> {
    let engine = Engine::default();

    let …
Run Code Online (Sandbox Code Playgroud)

rust webassembly wasmtime rust-wasm

3
推荐指数
1
解决办法
1081
查看次数

Rust wasm 将输入事件监听器附加到元素

如何将input事件侦听器添加到HtmlInputElement/ HtmlTextAreaElement. 我正在使用web-sys并阅读this,但随后,我在闭包内使用的所有元素(在本例中尤其是input元素)都被移至闭包中,之后我无法附加侦听器。

let closure = Closure::wrap(Box::new(|_: web_sys::InputEvent| {
    console_log!("{}", input.value());
}) as Box<dyn FnMut(_)>);

input.add_event_listener_with_callback("input", closure.as_ref().unchecked_ref())?;
// ^
// Doesn't work because the `input` variable was moved into the closure.
Run Code Online (Sandbox Code Playgroud)

具体来说我得到:

borrow of moved value: `input`
Run Code Online (Sandbox Code Playgroud)

rust rust-wasm

2
推荐指数
1
解决办法
3124
查看次数

Google chrome 和 Apple M1 中的计算着色器

我有一个用 wgpu/rust 编写的物理模拟器,当我从命令行运行时它可以工作。但是,当我尝试在 chrome v114 上运行(根据我在网上看到的支持)时,我收到以下错误,指出计算工作组的最大数量为零。我打印了适配器功能,得到以下信息:Limits { . . . max_compute_workgroup_storage_size: 0, max_compute_invocations_per_workgroup: 0, max_compute_workgroup_size_x: 0, max_compute_workgroup_size_y: 0, max_compute_workgroup_size_z: 0, max_compute_workgroups_per_dimension: 0, max_push_constant_size: 256 }

此外,抛出错误时控制台会转储以下内容: Version: WebGL 2.0 (OpenGL ES 3.0 Chromium)

我的适配器设置错误吗?或者 wgpu 还不支持浏览器中的计算着色器?欢迎任何建议。感谢大家。

编辑:以防万一这会破解代码,这些是我在本机运行时的设备功能。


...
max_compute_workgroup_storage_size: 16384, 
max_compute_invocations_per_workgroup: 256, max_compute_workgroup_size_x: 256, max_compute_workgroup_size_y: 256, max_compute_workgroup_size_z: 64, max_compute_workgroups_per_dimension: 65535, max_push_constant_size: 0 }```
Run Code Online (Sandbox Code Playgroud)

webgl rust webgpu rust-wasm wgpu-rs

2
推荐指数
1
解决办法
287
查看次数

安装时可能无法安装“wasm32-wasi”目标

为什么在安装时cargo build --target wasm32-wasi会抛出错误并提示没有安装。\n重现的步骤wasm32-wasi

\n
    \n
  1. 货运新列车
  2. \n
  3. rustup 目标添加 wasm32-wasi
  4. \n
  5. 货物构建--目标 wasm32-wasi
  6. \n
\n

接下来是控制台的输出

\n
\xe2\x9e\x9c  train git:(master) \xe2\x9c\x97 cargo build --target wasm32-wasi\n   Compiling train v0.1.0 (/user/playground/rustLang/train)\nerror[E0463]: can't find crate for `std`\n  |\n  = note: the `wasm32-wasi` target may not be installed\n  = help: consider downloading the target with `rustup target add wasm32-wasi`\n\nerror: cannot find macro `println` in this scope\n --> src/main.rs:2:5\n  |\n2 |     println!("hello");\n  |     ^^^^^^^\n\nerror: requires `sized` lang_item\n\nFor more information about this …
Run Code Online (Sandbox Code Playgroud)

rust rust-cargo rustup rust-wasm

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