跳至內容
出自 Arch Linux 中文维基

根據維基百科

Rust 是由 Mozilla 主導開發的通用、編譯型程式語言。設計準則為「安全、並發、實用」,支持函數式、並髮式、過程式以及面向對象的程序設計風格。Rust 的設計目標之一,是要使設計大型的網際網路客戶端和伺服器的任務變得更容易。因此更加強調安全性、存儲器配置、以及並發處理等方面的特性。

語言核心

Rust 核心庫

Rust 核心庫是 Rust 標準庫的基礎,無需依賴。它直接與 LLVM 原語對接,使 Rust 可以與平台和硬體無關。正是這種與 LLVM 的集成,使 Rust 比 Clang 編譯的同樣功能的 C 語言程序性能更高,使得用 libcore 設計的 Rust 軟體比 C 語言的更底層。為嵌入式平台設計軟體的開發者可通過 #![no_std] 放棄使用標準庫,只使用語言自帶的核心庫,以獲得更小的二進制文件和更好的性能。然而,由於大多數庫都需要標準庫,使用 #![no_std] 意味著來自 Rust 社區的軟體支持會受限。

Rust 標準庫

Rust 標準庫提供了方便的高級抽象,用於開發大多數可移植的 Rust 軟體。標準庫的特點包括 VecString 類型、大量的語言原語方法、大量的標準宏、I/O 和多線程支持、使用 Box 實現的堆分配,以及更多核心庫不具有的高級特性。

發布周期

Firefox 類似,Rust 使用每六周的發布周期。在每個新版本中,核心庫和標準庫都會得到改進,以支持更多的平台、提高性能,以及為穩定版本增加新特性。

安裝

安裝 Rust 主要有兩種方式:

  • 直接安裝。如果你只使用 Rust 來運行或安裝軟體,推薦使用此方式。
  • Rustup 安裝。如果你打算進行 Rust 編程,推薦使用此方式。

直接安裝

要從 Arch Linux 官方軟體庫中安裝最新的穩定版 Rust,安裝 rust。這將安裝 rustc 編譯器和 Cargo

除此之外還有開發版的 Rust 編譯器 rust-nightly-binAURrust-gitAUR 可用,分別用於預編譯的通用二進制文件、編譯器與系統庫的構建。

通過 rustup 安裝

為開發軟體,官方推薦的 Rust 安裝方法是使用 rustup 工具鏈管理器安裝。

使用 rustup 工具鏈管理器而不是倉庫中獨立的 Rust 軟體包的優點,主要是能為多個目標平台(Windows、macOS、Android)和架構(x86、x86_64、arm)安裝多個工具鏈(穩定版、測試版、開發版)。需要注意的是,安裝 rustup 並不會自動安裝 Rust 工具鏈,使用任何方法更新 rustup 也不會自動提供 Rust 的最新工具鏈版本。有關工具鏈的更多信息,請參見#用法rustup 工具鏈文檔

Rustup 的安裝有兩種方式,一種是通過 Arch Linux 自帶的 pacman,另一種是通過 Rust 官方安裝腳本。

Arch Linux 軟體包

rustup 在 Arch Linux 軟體倉庫中可用。注意,以這種方式安裝時,rustup self update起作用,只能使用 pacman 更新 rustup。然而,這一變化並不適用於其他 rustup 功能,例如用於更新 Rust 工具鏈的 rustup update

使用此軟體包的優點是 Rust 可執行文件都在 /usr/bin 目錄內,而不是 ~/.cargo/bin,因此避免了在 PATH 中添加其他目錄的麻煩。

注意:rustup 軟體包默認不會安裝工具鏈。它提供了 /usr/bin/rustup/usr/bin/rustc/usr/bin/cargo 等普通二進制文件之間的符號連結。如上所述,要使上述 Rust 命令能工作,用戶仍需手動安裝工具鏈。

為安裝工具鏈,需要指定使用的版本號或使用穩定版(stable)、測試版(beta)、開發版(nightly):

$ rustup default stable

構建 Rust 時更新 LLVM

由於 Rust 採用引導策略進行構建,因此在構建前必須先安裝一個已經可用的 Rust 軟體包。當構建使用的 llvm 版本高於官方倉庫中的版本時,需要提供用於構建倉庫中 Rust 版本的舊版 llvm-libs 動態連結庫才能進行構建。

示例:官方倉庫提供 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,運行腳本以安裝 rustup:./rust.sh。此腳本僅對當前登錄 Shell 的配置文件進行 PATH 修改。在註銷並重新登錄之前需要source ~/.cargo/env。在此之後升級 rustup 需執行 rustup self update

該腳本自動安裝並激活默認工具鏈(rust 所使用的工具鏈),因此無需手動安裝工具鏈即可使用 Rust。

警告:正如 Rust 文檔所建議的,執行 curl some-url | sh 會帶來安全風險,因為它執行的是未知的、甚至可能在下載過程中被破壞的代碼。因此建議在執行腳本之前,手動下載並檢查。
注意:在運行 rustup 時請確保 ~/.cargo/binPATH 內。

用法

可能需要手動安裝工具鏈,例如穩定版(stable)、測試版(beta)、開發版(nightly)或特定版本(1.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 編譯器,需要執行以下命令:

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

此操作只會為目標架構安裝 Rust 及其工具,但在交叉編譯時可能還需要其他工具。

Windows

本節中,$ARCH 是目標架構(x86_64i686)。以下內容將解釋如何使用 rustup 進行交叉編譯。

  1. 安裝 mingw-w64-gcc
  2. 為目標架構安裝 Rust 標準庫:rustup target add $ARCH-pc-windows-gnu
  3. 最後,為了使 cargo 能找到 MinGW-w64 gcc/ar,需要在 ~/.cargo/config.toml 中添加如下內容:
~/.cargo/config.toml
[target.$ARCH-pc-windows-gnu]
linker = "/usr/bin/$ARCH-w64-mingw32-gcc"
ar = "/usr/bin/$ARCH-w64-mingw32-ar"

最後,通過向 cargo 傳遞 --target $ARCH-pc-windows-gnu 參數,即可為 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 為更新通道:穩定版(stable)、測試版(beta)或開發版(nightly)。

非官方軟體包

非官方倉庫 archlinuxcn 有 rust-nightly 和 i686, ARM, ARMv7, Windows 32 & 64 的 Rust 標準庫,因此只需安裝對應的標準庫即可享受交叉編譯。然而,ARM 工具鏈只能自行尋找。對於 32 位 Windows 目標,需要獲取 mingw-w64-gcc 提供的 libgcc_s_dw2-1.dll 來編譯運行。

Cargo

Cargo,Rust 的包管理器,是 rust 的一部分。作為 rust-nightly-binAUR 的一部分,Cargo 開發版(nightly)在 AUR 上可用。如果使用 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/config.toml 中添加一個標誌,Cargo 將始終為本機 CPU 進行編譯優化。請注意,由此產生的二進制文件無法在其他計算機上運行。如果未來更換 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 支持

工具

Rust 項目的推薦工具請參閱 https://www.rust-lang.org/zh-CN/tools

rust-analyzer

rust-analyzer 是官方的 Rust 語言伺服器協議(LSP)實現,已取代 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 藉助編譯器插件支持實現了許多額外提示,能檢測出更多錯誤和非慣用的 Rust 語法。rust 軟體包中包含了 Clippy。

使用 rustup 安裝 Clippy:

$ rustup component add clippy

Rustfmt

Rustfmt 是一個根據官方代碼風格規範來格式化 Rust 代碼的工具。

rust 軟體包中包含了 Rustfmt。執行以下命令,用 rustup 來安裝 Rustfmt:

$ rustup component add rustfmt

編輯器

Emacs

Emacs 對 Rust 的支持可通過官方的 rust-mode 插件獲取。

Emacs 支持使用 EglotGNU 文檔lsp-bridge 等包連接 rust-analyzer

GNOME Builder

GNOME Builder 對 Rust 的支持通過語言伺服器協議(LSP)實現。默認使用 rust-analyzer,需要同時安裝 Rust 原始碼。

Helix

Helix 編輯器使用 Rust 編寫,包含了 Rust 語言伺服器協議(LSP)。Helix 的靈感來自 Neovim 和 Kakoune。

Kate

Kate 對 Rust 的支持通過語言伺服器協議(LSP)實現。默認使用 rust-analyzer,需要同時安裝 Rust 原始碼。

IntelliJ IDEA

IntelliJ IDEARust 插件。此插件同樣適用於 CLion。

如果使用 rustup,請使用 rustup 下載原始碼(rustup component add rust-src),然後將工具鏈所在位置指定為 ~/.rustup/toolchains/<your toolchain>/bin

如果使用 Arch Linux 官方軟體庫中的 Rust,請將工具鏈所在位置指定為 /usr/bin,將標準庫所在位置指定為 /usr/lib/rustlib/src/rust/library/

Jetbrains RustRover

Jetbrains 也正在開發一款專為 Rust 設計的編輯器,目前僅處於早期訪問階段。

它可以在官方網站上找到並下載,或者在 AUR 中找到 (rustroverAURrustrover-eapAUR)。

Visual Studio Code

Visual Studio Code 對 Rust 的支持可通過 rust-analyzerrust-lang.rust-analyzer 擴展獲取。

Vim

Vim 對 Rust 的支持可通過官方的 rust.vim 插件獲取,支持文件檢測、語法高亮、格式化和 Syntastic 語法檢查插件。許多代碼補全引擎都支持 Rust,例如 coc(通過 coc-rust-analyzer 插件)和 YouCompleteMe

另見