如何在不使用 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
}
如何将其转换为没有 webpack
的 wasm
文件?
如何获取整个项目(及其库依赖项)并将它们全部编译为 Wasm?
你可以直接用cargo build --target wasm32-unknown-unknown
编译WebAssembly。这本质上就是围绕 wasm-pack
和 wasm-bindgen
等其他工具构建的,如果您不想要它(例如,如果您不以 JavaScript 为目标),您可以使用它来直接编译成 WebAssembly。
不过有一些注意事项:
- WebAssembly 模块和主机之间的所有通信都必须使用
extern
函数进行。这意味着只能使用有限数量的类型,主要是基本类型(整数、浮点数、布尔值和指针)。除非您在顶部使用额外的抽象层(这就是 wasm-bindgen
所做的),否则您将无法传递复杂类型。
wasm32-unknown-unknown
目标不支持标准库的大部分(例如,包括文件系统和网络)。如果您的 WebAssembly 主机支持 WASI(WebAssembly 系统接口),您可以使用 wasm32-wasi
目标来编译具有 WASI 支持的模块,它支持更多的标准库。
我想使用 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
}
如何将其转换为没有
webpack
的wasm
文件?如何获取整个项目(及其库依赖项)并将它们全部编译为 Wasm?
你可以直接用cargo build --target wasm32-unknown-unknown
编译WebAssembly。这本质上就是围绕 wasm-pack
和 wasm-bindgen
等其他工具构建的,如果您不想要它(例如,如果您不以 JavaScript 为目标),您可以使用它来直接编译成 WebAssembly。
不过有一些注意事项:
- WebAssembly 模块和主机之间的所有通信都必须使用
extern
函数进行。这意味着只能使用有限数量的类型,主要是基本类型(整数、浮点数、布尔值和指针)。除非您在顶部使用额外的抽象层(这就是wasm-bindgen
所做的),否则您将无法传递复杂类型。 wasm32-unknown-unknown
目标不支持标准库的大部分(例如,包括文件系统和网络)。如果您的 WebAssembly 主机支持 WASI(WebAssembly 系统接口),您可以使用wasm32-wasi
目标来编译具有 WASI 支持的模块,它支持更多的标准库。