在Rust中为WebAssembly实现条件编译及指定wasm32目标的方法
针对WebAssembly的Rust条件编译指南
1. 基础的WebAssembly条件编译方式
如果你的代码逻辑适用于所有wasm32架构的目标(包括wasm32-unknown-unknown、wasm32-wasi等),最简单的方式是直接基于架构判断:
#[cfg(target_arch = "wasm32")] fn wasm_specific_function() { // 仅在wasm32目标下编译的代码 } #[cfg(not(target_arch = "wasm32"))] fn native_specific_function() { // 非wasm目标下的代码 }
2. 精准匹配wasm32-unknown-unknown目标
你担心#[cfg(target_os = "unknown")]会误匹配其他目标是完全正确的——确实存在一些嵌入式目标的target_os也是unknown。要精准锁定wasm32-unknown-unknown,需要结合三个目标属性:target_arch、target_os和target_vendor,从你打印的环境变量也能看到,这个目标的三个属性分别是wasm32、unknown、unknown。
方式一:直接在代码中组合条件
#[cfg(all(target_arch = "wasm32", target_os = "unknown", target_vendor = "unknown"))] fn wasm_unknown_unknown_only() { // 仅针对wasm32-unknown-unknown的代码 }
方式二:在build.rs中自定义编译标志
如果觉得上面的组合条件太长,你可以在build.rs中提前判断并设置自定义cfg标志,让代码更简洁:
use std::env; fn main() { let target_arch = env::var("CARGO_CFG_TARGET_ARCH").expect("Failed to get target arch"); let target_os = env::var("CARGO_CFG_TARGET_OS").expect("Failed to get target os"); let target_vendor = env::var("CARGO_CFG_TARGET_VENDOR").expect("Failed to get target vendor"); // 精准匹配wasm32-unknown-unknown if target_arch == "wasm32" && target_os == "unknown" && target_vendor == "unknown" { // 向Rust编译器传递自定义cfg标志 println!("cargo:rustc-cfg=wasm_unknown_unknown"); } }
之后在代码里就可以用更简洁的条件判断:
#[cfg(wasm_unknown_unknown)] fn wasm_specific_logic() { // 仅针对wasm32-unknown-unknown的代码 }
补充说明
- 如果你不需要区分不同的wasm目标(比如同时兼容
wasm32-unknown-unknown和wasm32-wasi),仅用#[cfg(target_arch = "wasm32")]就足够,这种方式更通用。 - 从Rust 1.57版本开始,还可以使用
#[cfg(target_family = "wasm")]来匹配所有wasm相关目标,它的作用和target_arch = "wasm32"基本一致,主要是为了和其他目标家族(比如unix、windows)对齐。
内容的提问来源于stack exchange,提问作者user1350184
相关产品推荐
相关产品推荐

