在 Rust 中包含特定于 CPU 架构的源文件

Posted

技术标签:

【中文标题】在 Rust 中包含特定于 CPU 架构的源文件【英文标题】:Including CPU architecture specific source files in Rust 【发布时间】:2021-01-02 01:17:45 【问题描述】:

我正在开发一个需要编译到 ARM Cortex-M 以及 ARM64 和 X86 Linux 平台的 Rust 可执行项目(音频编解码器 + 驱动程序)。我们希望项目结构能够使特定于目标的代码可以放在单独的特定于目标的文件和目录中,而与目标无关的代码只保存在一个地方。例如,我们希望*** main.rs 有条件地包含 arm64/main.rsthumb/main.rsx86/main.rs 文件,其中每个目标特定的 main.rs 文件可能会做截然不同的事情。

我的问题是:

    做这种事情的最佳方法是什么?通常,在 C/C++ 中这是微不足道的,但我不知道如何使用 cfg! 宏来做到这一点。 有没有办法直接在 Cargo.toml 中指定这些内容,而不是在 Rust 源文件中指定它们?

非常感谢任何帮助或指向执行此类事情的项目的指针。

【问题讨论】:

【参考方案1】:

您可以在任何东西上使用#[cfg(...)] 属性,包括函数、模块和单个代码块。

最简单的方法是在一个文件中创建多个main 函数,其中每个函数都有一个#[cfg(...)] 属性。 The reference 有很多可供您使用的配置选项。

#[cfg(target_arch = "x86_64")]
fn main() 
    println!("Hello from x86_64");


#[cfg(target_arch = "arm")]
fn main() 
    println!("Hello from ARM");

但是您询问了多个文件。在 Rust 中,每个文件都是一个模块,您可以将相同的 cfg 属性附加到模块声明中。例如,您可能有两个特定于架构的文件:

// main_x86_64.rs
pub fn main() 
    println!("Hello from x86_64");

// main_arm.rs
pub fn main() 
    println!("Hello from ARM");

然后,在真正的主函数中,有条件地编译其中一个,并有条件地调用一个主函数或另一个。

// main.rs

#[cfg(target_arch = "x86_64")]
mod main_x86_64;

#[cfg(target_arch = "arm")]
mod main_arm;

#[cfg(target_arch = "x86_64")]
fn main() 
    main_x86_64::main();


#[cfg(target_arch = "arm")]
fn main() 
    main_arm::main();

如果您正在寻找更广泛的模式,我会向您指出core 组织特定于平台的事物的方式。有一个arch module 有条件地在每个平台的子模块中仅在该平台上编译。您可以在source code 中看到每个子模块都有一个cfg 属性,因此它只能在该平台上编译。

【讨论】:

以上是关于在 Rust 中包含特定于 CPU 架构的源文件的主要内容,如果未能解决你的问题,请参考以下文章

rust 支持的CPU架构

有没有办法在 Rust 库中包含二进制或文本文件?

蚂蚁集团 CeresDB 团队 | Rust CPU Affinity 初探

rust 交叉编译树莓派程序

rust 交叉编译树莓派程序

rust 交叉编译树莓派程序