调用文件中最简单的函数之一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(编译为 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)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) 嘿@all,我正在使用WebAssembly Studio并创建了一个空的 Rust 项目。
在我的 Rust 代码中,我返回“Hello World”字符串的指针和长度。编译工作正常,但我期望生成的 WASM 有一个返回两个 i32 的函数。但我发现一个函数接受一个 i32 并且没有返回任何内容。
为什么该函数没有签名 fn () -> (i32,i32) ?
我该如何从 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代码以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) 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) 我发现了这个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 …
在较高级别上,我尝试创建一个 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) 如何将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) 我有一个用 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) 为什么在安装时cargo build --target wasm32-wasi会抛出错误并提示没有安装。\n重现的步骤wasm32-wasi
接下来是控制台的输出
\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-wasm ×12
rust ×11
webassembly ×8
wasm-bindgen ×3
javascript ×2
rust-cargo ×2
algorithm ×1
bubble-sort ×1
c++ ×1
ffi ×1
ffmpeg ×1
performance ×1
rustup ×1
unit-testing ×1
wasm-pack ×1
wasmtime ×1
webgl ×1
webgpu ×1
wgpu-rs ×1