You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:48:51