rust - 如何在不使用构建脚本的情况下将可执行文件的完整目标三重作为编译时常量?

标签 rust cross-compiling rust-cargo

我正在编写一个 Cargo 辅助命令,它需要知道 Rust/Cargo 使用的默认目标三元组(我假设它与主机的目标三元组相同)。理想情况下,它应该是一个编译时常量。

ARCH常量,但不是完整的三元组。例如,它不区分软浮点和硬浮点 ARM ABI。

env!("TARGET") 将是理想的,但它仅为构建脚本设置,而不是 lib/bin 目标。我可以使用 build.rs 和动态源代码生成将它传递给 lib(将值写入 OUT_DIR 中的 .rs 文件) , 但仅仅为了获得一个编译器无论如何都必须知道的字符串似乎是一项艰巨的任务。

有没有更直接的方法在用 Cargo 构建的 lib/bin 目标中获取当前目标三元组?

最佳答案

构建脚本打印一些 additional output到一个文件,所以你不能确定构建脚本只打印了 $TARGET 的输出。

相反,在 build.rs 中尝试这样的事情:

fn main() {
    println!(
        "cargo:rustc-env=TARGET={}",
        std::env::var("TARGET").unwrap()
    );
}

这将在构建脚本中获取 $TARGET 环境变量的值并设置它,以便在程序启动时可以访问它。

在我的 main.rs 中:

const TARGET: &str = env!("TARGET");

现在我可以在我的程序中访问目标三元组。如果您使用这种技术,您将只会读取 TARGET 环境变量的值,而不会读取其他任何内容。

关于rust - 如何在不使用构建脚本的情况下将可执行文件的完整目标三重作为编译时常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48967583/

相关文章:

openssl - 同时使用 git2 和 hyper : openssl linked more than once

rust - 你能在 Rust 中指定返回类型可变性吗?

`for...in` 循环中的 Rust 借用规则

eclipse - libopencv_highgui.so.3.4 : cannot open shared object file: No such file or directory in the eclipse ide for cross compiler

Delphi Indy10 在 Linux 下需要 SSL 库?

datetime - 如何将 chrono::Datetime 舍入到最接近的秒数?

rust - 使用格式时,如何在正 float 之前强制使用 '+' 符号!宏观?

c - 为什么像 memchr 这样的函数绑定(bind)到 C 实现而不是用纯 Rust 编写?

c - 关于交叉编译的 c 中内置函数的警告

rust - 如何在 Cargo 配置中为构建和测试指定不同的默认目标?