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

RAb*_*ham 5 rust webassembly

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

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

#[no_mangle]
pub extern fn sum(x: i32, y: i32) -> i32 {
    x + y
}
Run Code Online (Sandbox Code Playgroud)
  1. 如何将其转换为wasm没有的文件webpack

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

Frx*_*rem 11

您可以直接使用cargo build --target wasm32-unknown-unknown. 这本质上是其他工具喜欢wasm-packwasm-bindgen围绕它构建的,如果您不想要(例如,如果您不针对 JavaScript),您可以使用它直接编译为 WebAssembly。

不过有一些注意事项:

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

  • 他们表示,他们的目标是“python-ext-wasm”,它是 Wasmer 项目的一部分,而该项目又使用并支持 WASI API,因此“wasm32-wasi”是合适的目标。 (2认同)
  • @RReverser我怀疑这一点(这就是为什么我将其添加到我的答案中),但我在“python-ext-wasm”的存储库页面上找不到任何直接引用。 (2认同)