如何在不使用 wasm-pack 的情况下将 Rust 项目编译为 Wasm?

How do I compile a Rust project to Wasm without using wasm-pack?

我想使用 python-ext-wasm 将 Rust program/project 编译为 Wasm,以便在我的 Python 应用程序中使用。现有教程假设它是针对网络的,并建议 wasm-pack。有没有另一种方法可以在没有 JavaScript 绑定的情况下将 Rust 编译为 Wasm?

例如,如果我有一个 Rust 程序 (myproject/math.rs)。

#[no_mangle]
pub extern fn sum(x: i32, y: i32) -> i32 {
    x + y
}
  1. 如何将其转换为没有 webpackwasm 文件?

  2. 如何获取整个项目(及其库依赖项)并将它们全部编译为 Wasm?

你可以直接用cargo build --target wasm32-unknown-unknown编译WebAssembly。这本质上就是围绕 wasm-packwasm-bindgen 等其他工具构建的,如果您不想要它(例如,如果您不以 JavaScript 为目标),您可以使用它来直接编译成 WebAssembly。

不过有一些注意事项:

  • WebAssembly 模块和主机之间的所有通信都必须使用 extern 函数进行。这意味着只能使用有限数量的类型,主要是基本类型(整数、浮点数、布尔值和指针)。除非您在顶部使用额外的抽象层(这就是 wasm-bindgen 所做的),否则您将无法传递复杂类型。
  • wasm32-unknown-unknown 目标不支持标准库的大部分(例如,包括文件系统和网络)。如果您的 WebAssembly 主机支持 WASI(WebAssembly 系统接口),您可以使用 wasm32-wasi 目标来编译具有 WASI 支持的模块,它支持更多的标准库。