美文网首页
rust条件编译

rust条件编译

作者: 子由 | 来源:发表于2020-08-31 18:19 被阅读0次

条件编译的使用方法

两种操作方式进行rust的条件编译

  1. cfg属性:在属性的位置标注 #[cfg(...)]
    例如
#[cfg(target_os = "windows")]
mod os {
  // windows相关结构方法代码
  ...
} 
#[cfg(target_os = "linux")]
mod os {
  // linux相关结构方法代码
  ...
} 
  1. cfg宏:在条件表达式中使用cfg!(...)
    例如
if cfg!(target_os = "windows") {
  // windows系统要执行的代码段
} else if cfg!(target_os = "linux") {
  // linux系统要执行的代码段
}

除了按系统类型条件编译外,rust还支持以下类型条件:

  • debug_assertions - 若没有开启编译优化时就会成立。
  • target_arch = "..." - 目标平台的CPU架构,包括但不限于x86, x86_64, mips, powerpc, arm或aarch64。
  • target_endian = "..." - 目标平台的大小端,包括big和little。
  • target_env = "..." - 表示使用的运行库,比如musl表示使用的是MUSL的libc实现, msvc表示使用微软的MSVC,gnu表示使用GNU的实现。 但在部分平台这个数据是空的。
  • target_family = "..." - 表示目标操作系统的类别,比如windows和unix。这个属性可以直接作为条件使用,如#[unix],#[cfg(unix)]。
  • target_os = "..." - 目标操作系统,包括但不限于windows, macos, ios, linux, android, freebsd, dragonfly, bitrig, openbsd, netbsd。
  • target_pointer_width = "..." - 目标平台的指针宽度,一般就是32或64。
  • target_vendor = "..." - 生产商,例如apple, pc或大多数Linux系统的unknown。
  • test - 当启动了单元测试时(即编译时加了--test参数,或使用cargo test)。
    还可以根据一个条件去设置另一个条件,使用cfg_attr,如

此外rust支持使用any,all,not等限定条件编译的条件之间的关系

比如

// 这个函数仅当操作系统不是Linux 时才会编译
#[cfg(not(target_os = "linux"))]
fn not_linux() {
    println!("You are not running linux!");
}

// 这个函数当为macos**或者**ios时才会编译
#[cfg(any(target_os = "macos", target_os="ios"))]
fn you_are_apple {
  println!("You are running macos or ios");
}

// 这个函数当为32位的Unix系统时才会编译
#[cfg(all(unix, target_pointer_width = "32"))]
fn on_32bit_unix() {
  println!("You are running 32 bit unix");
}

自定义条件

自定义条件的属性标注方式如下:

#[cfg(some_condition)]
fn conditional_function() {
    println!("condition met!")
}

fn main() {
    conditional_function();
}

target_os等rustc已经支持的条件可以隐式判断进行编译,而自定义条件,需要在编译需要显式指定编译条件。

  1. 使用rustc 编译
$ rustc custom.rs && ./custom
No such file or directory (os error 2)

以上编译方式会报错,因为直接执行编译找不到条件下的conditional_function方法
需要使用以下方法编译:

$ rustc --cfg some_condition custom.rs && ./custom
condition met!
  1. 使用cargo编译
    首先,需要在cargo.toml文件里增加以下内容
[features]
some_condition = []

直接执行cargo build会报错找不到方法
正确方法应该使用以下方式编译:

$ cargo build --features some_condition

相关文章

  • rust条件编译

    条件编译的使用方法 两种操作方式进行rust的条件编译 cfg属性:在属性的位置标注 #[cfg(...)]例如 ...

  • Rust 在 cargo 中进行条件编译

    说明 在Rust 条件编译中,我们简单介绍了条件编译,但是在例子中并没有给出如何结合cargo进行编译。下面,我们...

  • Rust 交叉编译与条件编译总结

    2019.2.2 改标题 文档列表见:Rust 移动端跨平台复杂图形渲染项目开发系列总结(目录) 主体项目编译前的...

  • Rust编程知识拾遗:Rust 条件编译

    条件编译可以通过两种不同的操作符实现,如下: cfg属性:在属性位置中使用#[cfg(...)] cfg!宏:在布...

  • Rust环境搭建

    安装Rust 创建项目 编辑main.rs 编译或运行rust源码

  • 1. Rust 安装和使用

    一般安装不会只安装rust编译器,而是下载rustup工具,它是rust的安装器(安装编译器、标准库、Cargo等...

  • 2.Rust新手教程-数据类型

    学习笔记,仅此而已 Rust是静态编译语言,在编译时必须知道所有变量的类型,其中Rust内部有2套机制 基于定义的...

  • 关于rust中的“安全”与“非安全”

    在实际使用Rust过程中很多时候,基于rust自身的来实现功能和代码的编写,并依托编译期自身来帮助我们进行“编译检...

  • 介绍Rust(2): 基本数字类型

    Rust(1) 介绍了rust的安装 编译代码以及包管理工具。这一篇文章将重点介绍Rust的基本基本数字类型。 我...

  • Rust入坑指南:亡羊补牢

    如果你已经开始学习Rust,相信你已经体会过Rust编译器的强大。它可以帮助你避免程序中的大部分错误,但是编译器也...

网友评论

      本文标题:rust条件编译

      本文链接:https://www.haomeiwen.com/subject/xrhpsktx.html