标签: webassembly

在 Windows 上使用 emscripten 将 Rust 编译为 WebAssembly 时出错

我只是尝试在 Windows 上使用 emscripten 将 Rust 示例项目编译为 WebAssembly,但它会导致错误。我该如何修复它?

我做了什么:

  1. 安装emscripten
>git clone https://github.com/emscripten-core/emsdk.git
>cd emsdk
>git pull
>emsdk install latest
>emsdk activate latest
>emsdk_env.bat
Run Code Online (Sandbox Code Playgroud)
  1. 安装 rustup 从https://www.rust-lang.org/ja/tools/install下载 rustup-init.exe 并运行它
  2. 通过 rustup 安装 wasm32 目标
>rustup target add wasm32-unknown-emscripten
Run Code Online (Sandbox Code Playgroud)
  1. 创建示例项目
>cargo new --bin web_assembly
>cd web_assembly
Run Code Online (Sandbox Code Playgroud)
  1. 尝试编译,但出现错误
>cargo build --target wasm32-unknown-emscripten
   Compiling web_assembly v0.1.0 (F:\github\rusttest\web_assembly)
error: linking with `emcc.bat` failed: exit code: 1
  |
  = note: "cmd" "/c" "emcc.bat" "-s" "DISABLE_EXCEPTION_CATCHING=0" "-L" "C:\\Users\\Username\\.rustup\\toolchains\\stable-x86_64-pc-windows-msvc\\lib\\rustlib\\wasm32-unknown-emscripten\\lib" "-L" "C:\\Users\\Username\\.rustup\\toolchains\\stable-x86_64-pc-windows-msvc\\lib\\rustlib\\wasm32-unknown-emscripten\\lib\\self-contained" "F:\\github\\rusttest\\web_assembly\\target\\wasm32-unknown-emscripten\\debug\\deps\\web_assembly.web_assembly.egwz9uoo-cgu.0.rcgu.o" "F:\\github\\rusttest\\web_assembly\\target\\wasm32-unknown-emscripten\\debug\\deps\\web_assembly.web_assembly.egwz9uoo-cgu.1.rcgu.o" "F:\\github\\rusttest\\web_assembly\\target\\wasm32-unknown-emscripten\\debug\\deps\\web_assembly.web_assembly.egwz9uoo-cgu.2.rcgu.o" "F:\\github\\rusttest\\web_assembly\\target\\wasm32-unknown-emscripten\\debug\\deps\\web_assembly.web_assembly.egwz9uoo-cgu.3.rcgu.o" …
Run Code Online (Sandbox Code Playgroud)

windows rust emscripten webassembly rustup

4
推荐指数
3
解决办法
3799
查看次数

具有两个依赖服务的循环依赖

我对 C# 和依赖注入非常陌生。目前我正在开发一个新项目,希望在技术上取得进步。

在这个项目中,我遇到了三种导致循环依赖的情况。

我读了很多关于这方面的内容并找到了诸如Lazy<T>和 之类的解决方案IServiceProvider的解决方案,但我想学习针对此问题的干净解决方案,并希望遵循最常见的建议来重构代码。

在这个例子中我们有四个服务:

AccountService-> 登录、注销等

HttpService-> 做 API 的事情

LogService-> 做一些日志记录

LogRepository-> 用于 EF 的日志表/包装器的 CRUD

AccountService使用 API 通过 API 进行身份验证HttpService。后来,我想使用HttpServiceAPI 通过 API 获取更多数据。HttpService现在需要AccountService获取令牌来验证请求。这导致循环依赖错误。

账户服务

public interface IAccountService
{
    Identity Identity { get; }
    Task Login(Credentials Credentials);
    Task Logout();
}

public class AccountService : IAccountService
{
    public Identity Identity { get; private set; }
    
    private readonly IHttpService _httpService;
    private …
Run Code Online (Sandbox Code Playgroud)

.net c# rest dependency-injection webassembly

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

如何等待来自 golang wasm 的 js 异步函数?

我写了一个小函数await来处理 go 中的异步 javascript 函数:

func await(awaitable js.Value) (ret js.Value, ok bool) {
    if awaitable.Type() != js.TypeObject || awaitable.Get("then").Type() != js.TypeFunction {
        return awaitable, true
    }
    done := make(chan struct{})


    onResolve := js.FuncOf(func(this js.Value, args []js.Value) interface{} {
        glg.Info("resolve")
        ret = args[0]
        ok = true
        close(done)
        return nil
    })
    defer onResolve.Release()

    onReject := js.FuncOf(func(this js.Value, args []js.Value) interface{} {
        glg.Info("reject")
        ret = args[0]
        ok = false
        close(done)
        return nil
    })
    defer onReject.Release()

    onCatch := js.FuncOf(func(this js.Value, args []js.Value) …
Run Code Online (Sandbox Code Playgroud)

javascript language-interoperability go webassembly

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

使用 WebAssembly 在浏览器中查询大型数据集

为了便于讨论,假设浏览器允许WebAssembly 应用程序使用4GB 内存。忽略压缩和其他数据存储考虑因素,如果用户有一个 3GB 的本地 csv 文件,我们可以使用 WebAssembly(当然也可以是 JavaScript)完全在内存中查询该数据。例如,如果用户的数据具有以下格式:

ID 国家 数量
1 我们 12
2 国标 11
3 7

然后,在几行代码中,我们可以执行一个基本算法来过滤ID=2,即 的 SQL 等效项SELECT * FROM table WHERE id=2

现在,我的问题是,是否有可能在任何浏览器中(并且可能使用实验标志和/或选择某些用户首选项),以便可以对不适合内存的文件进行查询,即使正确压缩也是如此。例如,在这篇博文中,加载并查询了约 500GB 的文件。我知道500GB的数据并没有完全加载到内存中,并且可能存在面向列的数据结构,因此只需要读取某些列,但无论哪种方式,操作系统都可以访问文件系统,因此文件比可以使用可用内存。

是否可以在 WebAssembly 浏览器应用程序中以任何方式执行此操作?如果是这样,如何完成的概要是什么?我知道这个问题可能需要一些研究,因此当它可以获得赏金时,我可以为其添加 500 点赏金以鼓励回答。(请注意,使用的底层语言是 C++-compiled-to-wasm,但我认为这对于这个问题来说并不重要。)

我想一种可能性可能是这样的:https://rreverser.com/web assembly- shell-with-a-real-filesystem-access-in-a-browser / 。

c++ google-chrome rust emscripten webassembly

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

Sqlite 与 Blazor Wasm (.NET 6) -&gt; System.DllNotFoundException: e_sqlite3

根据 .NET 6 中的新 Blazor WebAssembly 功能 .NET 6 中的新 Blazor WebAssembly 功能

Sqlite 与 Blazor Wasm (.NET 6) -> System.DllNotFoundException: e_sqlite3

任何人都可以在编译 Sqlite3.o 文件后获得工作示例

sqlite webassembly blazor

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

为什么规范中的“代码”不以幻数和版本号开头?

./polkadot build-spec --disable-default-bootnode --dev我正在使用(我正在运行版本0.9.8-3a10ee63c-x86_64-linux-gnu)创建规范

使用上述命令生成的规范包含code字段。我的理解是该字段包含 wasm 字节。然而,这些字节似乎不合适。

.wasm文件中,前 4 个字节应该是幻数(\0asm此处),接下来的四个字节应该是 wasm 规范的版本,之后可能是其他模式。我在这些 wasm 字节中没有看到那些东西。

这是一个错误吗?它使用某种编码吗?基本上,我如何从规范中获取 wasm 字节?

我在这里发布了 JSON 规范https://gist.github.com/kishansagathiya/b38b8f06964c8cb101ccab7fbefa428d

"code": "0x52bc537646db8e0528b52ffd0058543305de8806381552107855541d2c26fa78e0cf83b70a44352557cb13532c6d0da03c59cf642396cd44daa103555dc3770d003433894b7c7055d95101002568d5f5a28e71a5e6114909a47fa095fefffdbfb7ffde5bca2da54c01351574155015a0bfbfb2adf1efab2acd5757e1d...
Run Code Online (Sandbox Code Playgroud)

webassembly substrate polkadot

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

CompileError:WebAssembly.compile()

我正在尝试在WebAssembly中执行计算阶乘的基本C代码,并且在Google Chrome(57.0.2987.98)中加载WASM文件时得到

CompileError:WebAssembly.compile():
Wasm解码失败结果=预期的魔术字00 61 73 6d,
找到30 30 36 31 @ + 0`

C代码:

double fact(int i) {
  long long n = 1;
  for (;i > 0; i--) {
    n *= i;
  }
  return (double)n;
}
Run Code Online (Sandbox Code Playgroud)

浪费:

(module
  (table 0 anyfunc)
  (memory $0 1)
  (export "memory" (memory $0))
  (export "_Z4facti" (func $_Z4facti))
  (func $_Z4facti (param $0 i32) (result f64)
    (local $1 i64)
    (local $2 i64)
    (block $label$0
      (br_if $label$0
        (i32.lt_s
          (get_local $0)
          (i32.const 1)
        )
      )
      (set_local $1
        (i64.add …
Run Code Online (Sandbox Code Playgroud)

google-chrome webassembly

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

Rust wasm32-unknown-unknown数学函数没有链接

我正在为Rust尝试新的wasm32-unknown-unknown目标,并且我遇到了调用数学函数的问题(例如sin,cos,exp,atan2).

Cargo.toml:

[package]
name = "wasm_math"
version = "0.1.0"
authors = ["..."]

[lib]
path = "src/lib.rs"
crate-type = ["cdylib"]

[dependencies]
Run Code Online (Sandbox Code Playgroud)

SRC/lib.rs:

#[no_mangle]
pub extern "C" fn invoke_sin(x: f64) -> f64 {
    x.sin()
}
Run Code Online (Sandbox Code Playgroud)

index.html的:

<!doctype html>
<html lang="en">
  <head><meta charset="utf-8"><title>Wasm Math</title></head>
  <body></body>
  <script>
    const imports = { env: { } };
    fetch("target/wasm32-unknown-unknown/release/wasm_math.wasm").then(response =>
      response.arrayBuffer()
    ).then(bytes =>
      WebAssembly.instantiate(bytes, imports)
    ).then(results => {
      alert(results.instance.exports.invoke_sin(1.0));
    });
  </script>
</html>
Run Code Online (Sandbox Code Playgroud)

我用命令构建项目

cargo build --release --target wasm32-unknown-unknown
Run Code Online (Sandbox Code Playgroud)

当我在firefox中打开html文件时,出现以下错误:

LinkError: import object field 'sin' is not a …
Run Code Online (Sandbox Code Playgroud)

rust webassembly

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

Webassembly触发功能可能吗?

Webassembly是否支持触发功能?我的意思是喜欢内置支持,因为似乎我们必须从javascript导入那些。如果我们有这样的事情,那就太好了:

f32.sin
f32.cos
Run Code Online (Sandbox Code Playgroud)

如果有任何意义。如果它们不存在,我会假设它是因为实现非常依赖于系统。

问题:

想象我们有一个涉及这些数学函数的非常复杂且计算量大的公式。我想在不依赖导入或细分我的代码的情况下计算webassembly中的所有内容,其中一部分在webassembly中运行,另一部分在javascript中运行。

除此之外,我确实相信,如果内置了trig函数,则在语义上看起来会更整洁。

trigonometry webassembly

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

我在WebAssembly中的代码有多私密?

我在我的Web服务器上运行了一些c ++二进制文件来进行一些计算,我正在考虑使用Webassembly将它移动到用户端.我的问题是我的c ++代码将如何私有化?是否可以将已编译的Webassembly文件转换回c ++?

webassembly

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