gpt4 book ai didi

rust - 如何在 Rust 中有条件地为 WebAssembly 编译?

转载 作者:行者123 更新时间:2023-11-29 07:56:52 24 4
gpt4 key购买 nike

如何在有条件地选择 wasm32-unknown-unkown 目标的地方创建一个配置标志?

我使用以下 build.rs 打印了当前环境:

use std::env;

fn main() {
for (key, value) in env::vars() {
if key.starts_with("CARGO_CFG_") {
println!("{}: {:?}", key, value);
}
}
panic!("stop and dump stdout");
}

打印:

CARGO_CFG_DEBUG_ASSERTIONS: ""
CARGO_CFG_TARGET_ARCH: "wasm32"
CARGO_CFG_TARGET_ENDIAN: "little"
CARGO_CFG_TARGET_ENV: ""
CARGO_CFG_TARGET_HAS_ATOMIC: "16,32,8,ptr"
CARGO_CFG_TARGET_OS: "unknown"
CARGO_CFG_TARGET_POINTER_WIDTH: "32"
CARGO_CFG_TARGET_VENDOR: "unknown"

通常我会做 #[cfg(target_os = "linux")] 但在这种情况下这可能不起作用,因为 #[cfg(target_os = "unknown")] 可能比 wasm32-unknown-unknown 匹配更多。我是否必须结合使用 target_archtarget_os 才能正常工作,或者只是 target_arch

最佳答案

这就是stdweb正在做:

#[cfg(all(target_arch = "wasm32", target_os = "unknown"))]

我对其进行了测试,看起来像这样简单的东西工作得很好:

#[cfg(target_arch = "wasm32")]
fn add_seven(x: i32) -> i32 {
x + 7
}

#[cfg(not(target_arch = "wasm32"))]
fn add_seven(x: i32) -> i32 {
x + 6
}

fn main() {
let eight = add_seven(1);
println!("{}", eight);
}

Rust 中的条件编译允许大量的粒度,因为您可以指定操作系统、体系结构等。如果您不需要该粒度,则不必使用它。

wasm32unknownemscripten 操作系统目标,所以如果您的代码需要不同,最好区分这两者对于两个平台。

Stdweb 选择使用更精细的方法。如果我这样做,我会跟随他们正在做的事情,但似乎无论哪种方式都行得通。

关于rust - 如何在 Rust 中有条件地为 WebAssembly 编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48350087/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com