跳转至内容

Rust

来自 ArchWiki

来自 Wikipedia

Rust 是一种多范式、通用编程语言,它强调性能、类型安全和并发性。它强制执行内存安全——这意味着所有引用都指向有效的内存——而无需垃圾回收器。为了同时强制执行内存安全并防止数据竞争,其“借用检查器”在编译期间跟踪程序中所有引用的对象生命周期。Rust 的灵感来源于函数式编程的理念,包括不变性、高阶函数和代数数据类型。它在系统编程领域很受欢迎。

核心语言

Rust 核心库

Rust 核心库是 Rust 标准库的无依赖基础。它直接与 LLVM 原始类型接口,这使得 Rust 能够平台和硬件无关。正是这种与 LLVM 的集成使得 Rust 能够获得比使用 Clang 编译的同等 C 应用程序更高的性能,从而使使用 libcore 设计的 Rust 软件比 C 更底层。它只包含基本的平台无关类型,如 OptionResultIterator。希望针对嵌入式平台进行软件开发的开发者可以使用 #![no_std] 来放弃标准库,仅使用不包含“电池”的核心库,以获得更小的二进制文件大小和更高的性能。然而,使用 #![no_std] 会限制你从更广泛的 Rust 社区获得软件支持的数量,因为大多数库都需要标准库。

Rust 标准库

Rust 标准库提供了方便的高级抽象,大多数可移植的 Rust 软件都是通过这些抽象创建的。它包括 VecString 类型;大量用于语言原语的方法;大量的标准宏;I/O 和多线程支持;使用 Box 进行堆分配;以及核心库中不可用的许多其他高级功能。

发布周期

Rust 遵循固定的六周发布周期,类似于 Firefox 的发布周期。每个新版本都会改进核心库和标准库,以支持更多平台、提高性能并稳定新功能以供稳定版 Rust 使用。

安装

安装 Rust 的两种主要方法是

  • 原生安装,如果你只使用 Rust 来构建或安装用 Rust 制作的软件,则推荐使用此方法
  • rustup 安装,如果你打算用 Rust 编程任何东西,则推荐使用此方法

原生安装

要从官方 Arch Linux 软件仓库 安装最新稳定版的 Rust,请 安装 rust 包。这将安装 rustc 编译器和 Cargo

rustup

为开发目的安装 Rust 的官方推荐方法是使用用 Rust 编写的 rustup 工具链管理器

使用 rustup 工具链管理器而不是软件仓库中的独立预打包 Rust 的好处在于,能够为多个目标(windows、mac、android)和架构(x86、x86_64、arm)安装多个工具链(stable、beta、nightly)。需要注意的是,安装 rustup 并不会自动安装 Rust 工具链,通过任何方法更新 rustup 也不会自动提供最新版本的 Rust 工具链。请参阅 #用法rustup 工具链文档了解更多关于工具链的信息。

对于 rustup 安装有两种选择,一种是通过 pacman 由 Arch Linux 支持,另一种是由 Rust 通过其安装脚本官方支持。

Arch Linux 包

rustup 在 Arch Linux 软件仓库中可用。请注意,以此方式安装时 rustup self update 将 **不起作用**,需要通过 pacman 更新该包。但是,此更改不适用于其他 rustup 功能,例如更新 Rust 工具链的 rustup update

此包的优点在于各种 Rust 可执行文件位于 /usr/bin 中,而不是 ~/.cargo/bin,从而无需将另一个目录添加到你的 PATH

注意 rustup 包 **默认不安装** 工具链。它提供 /usr/bin/rustup/usr/bin/rustc/usr/bin/cargo 等常用二进制文件之间的符号链接。如上所述,用户仍需手动安装工具链才能使这些 Rust 命令生效。

为了安装工具链,你需要告诉 rustup 使用哪个版本,在 stablenightly 之间选择

$ rustup default stable

使用新版本 LLVM 构建 Rust

由于 Rust 使用引导策略进行构建,因此需要一个功能性的 Rust 包。在构建比官方仓库中 **更新** 的 llvm 版本时,用户会遇到需要一个旧版本 llvm-libs 的共享对象(用于构建仓库版本的 Rust)才能构建新版本 LLVM 的情况。

例如:官方仓库提供 llvm-18.1.8,目标是构建 llvm-19.1.6。

引导步骤需要 llvm-libs-18.1.8 中的 /usr/lib/libLLVM.so.18.1。此文件可以手动放置在构建根目录中,或由 llvm15-libs 等包提供。

上游安装脚本

rustup 也可以通过 rustup 官方网页手动下载和安装。

使用 curl --proto '=https' --tlsv1.3 -sSf https://sh.rustup.rs -o rust.sh 下载文件,用 less ./rust.sh 查看,然后运行脚本 ./rust.sh 开始 rustup 安装。该脚本仅对登录 shell 的 配置文件 进行 PATH 更改。你需要 source ~/.cargo/env 直到你注销并重新登录系统。之后要更新 rustup,请运行 rustup self update

该脚本默认安装并激活默认工具链(由 rust 包使用的那个),因此无需手动安装即可开始使用 Rust。

警告 运行 curl some-url | sh,如 Rust 文档所示,被认为存在安全风险,因为它会执行未知代码,而这些代码在下载过程中甚至可能被损坏。因此,建议手动下载脚本并在执行前进行检查。
注意 运行 rustup 时,请确保 ~/.cargo/bin 在你的 PATH 中。

用法

你可能需要手动安装一个工具链,例如 stablebetanightly1.58.0。如果你想使用/测试另一个工具链,也需要这样做。

$ rustup toolchain install toolchain

你现在可以通过运行 rustup run toolchain command 来运行 Rust 命令。但是,要直接使用这些命令,你需要激活工具链

$ rustup default toolchain

使用 rustc -V 检查已安装的 Rust 版本

$ rustc -V 
rustc 1.58.0 (02072b482 2022-01-11)

Rust 不自行进行链接,因此你需要安装一个链接器。你可以使用 gcc,否则 Rust 将生成以下错误: error: linker `cc` not found.

rustup 不会自动更新提供的工具链。如果用户希望使用最新版本的 Rust、crates 和其他相关包,他们可能偶尔需要使用 rustup update 更新其工具链。有关更多信息,请参阅 官方 rustup 文档

测试安装

通过构建一个简单的程序来检查 Rust 是否已正确安装,如下所示

~/hello.rs
fn main() {
    println!("Hello, World!");
}

你可以使用 rustc 编译它,然后运行它

$ rustc hello.rs && ./hello
Hello, World!

交叉编译

使用 rustup

你可以轻松地使用 rustup 进行交叉编译。rustup 支持许多交叉编译目标。完整的列表可以通过运行 rustup target list 找到。

例如,如果你想使用稳定版通道安装用于 Windows 的 Rust,并使用 GNU Compiler,你需要执行以下操作

$ rustup toolchain install stable-x86_64-pc-windows-gnu

这只会为你的目标架构安装 Rust 及其工具,但可能需要一些额外的工具来进行交叉编译。

Windows

在本节中,$arch 是目标架构(x86_64i686)。它将解释如何使用 rustup 进行交叉编译。

  1. 安装 mingw-w64-gcc
  2. 运行 rustup target add $arch-pc-windows-gnu 来为你的架构安装 Rust 标准库。
  3. 最后,通过将以下内容添加到你的 ~/.cargo/config.toml 文件中,告诉 cargo 在哪里可以找到 MinGW-W64 gcc/ar
~/.cargo/config.toml
[target.''$arch''-pc-windows-gnu]
linker = "/usr/bin/$''arch''-w64-mingw32-gcc"
ar = "/usr/bin/$''arch''-w64-mingw32-ar"

最后,你可以通过将 --target $arch-pc-windows-gnu 传递给 cargo 来交叉编译到 Windows

$ # Build
$ cargo build --release --target "$arch-pc-windows-gnu"
$ # Run unit tests under wine
$ cargo test --target "$arch-pc-windows-gnu"

目前使用 MinGW 6 和 rustup 安装的工具链构建可执行文件存在问题。要修复此问题,请执行

for lib in crt2.o dllcrt2.o libmsvcrt.a; do cp -v /usr/x86_64-w64-mingw32/lib/$lib $HOME/.rustup/toolchains/$CHANNEL-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-gnu/lib/; done

其中 CHANNEL 是更新通道(stablebetanightly

非官方包

非官方仓库 archlinuxcn 提供了 rust-nightly 和适用于 i686、ARM、ARMv7、Windows 32 位和 64 位的 Rust 标准库,因此你可以直接安装你想要的库然后享受交叉编译。但是,你需要自己找到一个 ARM 工具链。对于 32 位 Windows 目标,你需要获取一个 libgcc_s_dw2-1.dll(由 mingw-w64-gcc 提供)来构建和运行。

Cargo

Cargo,Rust 的包管理器,是 rust 包的一部分。夜间版可在 AUR 中作为 rust-nightly-binAUR[链接已损坏: 未找到包] 的一部分使用。如果你使用 rustup,它已经包含了 cargo。

Cargo 是一个允许 Rust 项目声明其各种依赖项并确保你始终获得可重复构建的工具。鼓励你阅读 官方指南

用法

使用 Cargo 创建一个新项目

$ cargo new hello_world 

这会创建一个带有默认 Cargo.toml 文件的目录,该文件设置为构建一个可执行文件。

注意 Cargo 使用此 Cargo.toml 作为清单,其中包含编译你的项目所需的所有元数据。
Cargo.toml
[package]
name = "hello_world"
version = "0.1.0"
edition = "2021"

[dependencies]

针对原生 CPU 平台优化

为了指示 Cargo 始终为你的 CPU 平台编译最优代码,你可以通过在 ~/.cargo/config.toml 文件中添加一个标志来实现。请注意,生成的二进制文件不能在其他计算机上分发使用,如果你将来决定更换 CPU,甚至可能在你自己的系统上失败。

查找你安装上默认使用的目标平台

$ rustup toolchain list
stable-x86_64-unknown-linux-gnu (default)

在这个例子中,我们在 x86_64-unknown-linux-gnu 平台上使用 stable Rust。

指示 Cargo 始终编译针对原生 CPU 平台优化的代码

~/.cargo/config.toml
[target.x86_64-unknown-linux-gnu]
rustflags = ["-C", "target-cpu=native"]

sccache

通过使用 sccachesccache 包)可以大大缩短编译时间。这将维护一个本地的编译器工件缓存,从而无需重新编译自上次编译以来未更改过的代码。

要启用 sccache,你可以使用 RUSTC_WRAPPER 环境变量

$ export RUSTC_WRAPPER=sccache
$ cargo build

或者

$ RUSTC_WRAPPER=sccache cargo build

或者,将以下配置添加到 ~/.cargo/config.toml

~/.cargo/config.toml
[build]
rustc-wrapper = "sccache"

IDE 支持

工具

请参阅 https://rust-lang.net.cn/tools 获取 Rust 项目推荐的工具。

rust-analyzer

rust-analyzer 是 Rust 的官方语言服务器协议实现,它已取代 RLS

它可作为 rust-analyzer 包使用,最新 Git 版本可作为 rust-analyzer-gitAUR 使用。或者,如果你安装了 rustup,你可以使用以下命令安装 rust-analyzer

$ rustup component add rust-analyzer

rust-analyzer 需要标准库的源代码。如果不存在,rust-analyzer 将尝试使用 rustup 自动安装它。要使用 rustup 手动安装源代码,请运行以下命令

$ rustup component add rust-src

Clippy

Clippy 利用编译器插件支持,提供大量额外的 lint,用于检测和警告更多种类的错误和非惯用 Rust 代码。

Clippy 已包含在 rust 包中。使用 rustup 安装它

$ rustup component add clippy

Rustfmt

Rustfmt 是一个根据官方风格指南格式化 Rust 代码的工具。

Rustfmt 已包含在 rust 包中。使用 rustup 安装它

$ rustup component add rustfmt

编辑器

Emacs

通过官方 rust-mode 插件,可以在 Emacs 中获得 Rust 支持。

GNOME Builder

GNOME Builder 对 Rust 的支持是通过语言服务器协议实现的。它默认使用 rust-analyzer;你只需要与 Rust 源代码一起安装它。

Helix

Helix 编辑器是用 Rust 编写的,并内置了 Rust 语言服务器协议。Helix 的灵感来自 Neovim 和 Kakoune。

Kate

Kate 对 Rust 的支持是通过语言服务器协议实现的。它默认使用 rust-analyzer;你只需要与 Rust 源代码一起安装它。

IntelliJ IDEA

IntelliJ IDEA 有一个 Rust 插件。相同的插件也适用于 CLion。

如果使用 rustup,请使用 rustup 下载源代码(rustup component add rust-src),然后将 ~/.rustup/toolchains/<your toolchain>/bin 选择为工具链位置。

如果使用官方 Arch Linux 软件仓库中的 Rust,请将 /usr/bin 选择为工具链位置,并将 /usr/lib/rustlib/src/rust/library/ 选择为 stdlib 源位置。

Jetbrains RustRover

Jetbrains 还在开发一个专为 Rust 设计的特殊编辑器。它可以在其官方 网站或 AUR 中的 rustroverAURrustrover-eapAUR 下找到并下载。

Visual Studio Code

可以通过 rust-analyzerrust-lang.rust-analyzer 扩展在 Visual Studio Code 中获得 Rust 支持。

Vim

通过官方 rust.vim 插件,可以在 Vim 中获得 Rust 支持,该插件提供文件检测、语法高亮、格式化以及对 Syntastic 语法检查插件的支持。许多补全引擎具有 Rust 支持,例如 coc(通过 coc-rust-analyzer 插件)和 YouCompleteMe

参见

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.