技術筆記 / Rust

Rust 環境選擇與原理

在 Windows 上常同時遇到:本機桌面程式(例如 Tauri)與部署到 Linux(例如 AWS Lambda)。這篇說明 rustup、編譯目標(target)與「在哪裝 Rust」之間的關係,方便你決定用 Windows 原生、WSL2,還是兩者並存。

相關筆記:


1. 先釐清三個層次

層次 是什麼 你實際遇到的名字
Rust 工具鏈(toolchain) 某個通道的 rustc + cargo + 標準函式庫,綁定 host(你正在執行編譯器的那台機器的 OS/arch) stable-x86_64-pc-windows-msvc、stable-x86_64-unknown-linux-gnu
編譯目標(target) 產出來的二進位要跑在哪種 OS/ABI x86_64-pc-windows-msvc、x86_64-unknown-linux-gnu、aarch64-unknown-linux-gnu 等
開發環境所在 你在哪裡開終端機、掛哪個檔案系統、裝哪些系統套件 Windows PowerShell、WSL2 Ubuntu、Docker、CI 上的 Linux

原理重點: cargo build 預設會建 「host = target」 的產物。你要產出「別種系統能跑的 exe 或 ELF」,就變成 cross-compile(或改名為同一台機器上的「非預設 target」),通常要額外的 linker、C 函式庫、有時還有 SDK。


2. Windows 本機:MSVC 與 GNU 兩條線

在 Windows 上,rustup 最常見的 default host 是:

原理: Rust 產生目標平台的機器碼之後,還要 連結(link) 成最終 executable。在 Windows 上,MSVC 目標依賴微軟提供的連結器與 CRT;GNU 目標則依賴另一套 mingw 工具。混用或終端機 PATH 指到錯的 link.exe(例如 Git Bash 的同名工具)就會出現各種詭異錯誤——这也是 Tauri 筆記強調 PowerShell / CMD 的原因。


3. WSL2:Linux host,但人還在 Windows 桌上

WSL2 裡的典型 host 是 x86_64-unknown-linux-gnu(或 ARM 機器則是對應的 aarch64-unknown-linux-gnu)。

原理: WSL2 是 貨真價實的 Linux 核心 + Linux 使用者空間(發行版如 Ubuntu),不是「模擬跑 Rust」,而是 另一套 OS 上的另一份 Rust。與「在實體機或 VM 裝 Ubuntu」對編譯行為而言,同一概念。

實務上常聽到的差異:


4. 依「產品跑在哪裡」選環境(決策表)

你的產出 建議主力環境 簡短原理
Windows 桌面(Tauri、WinUI 等) Windows + MSVC toolchain 連結器、WebView2、Windows API 與除錯流程都以 Windows 原生為準。
Linux 伺服器 / Lambda / 容器內二進位 WSL2 或 Linux VM / CI Host 與 target 皆 Linux,cargo、動態連結、腳本、檔案權限與正式環境一致。
幾乎只靠 CI 建 Linux,本機只寫碼 Windows -only 也行 本機不建 Linux artifact,負擔在 CI;本機仍要能跑測試的話通常還是 WSL 或 Docker 較順。
堅持只有一份 Rust(全在 Windows)又要 Linux 二進位 須處理 cross-compile(target + linker + sysroot) 可行但學習曲線陡,不如 WSL2「直接當 Linux 開發」直觀。

5. 兩套 Rust 並存算不算浪費?

不算。 Windows 上一份 rustup、WSL2 裡再一份 rustup,是 兩個 OS 環境各自一份工具,就像你在筆電裝 Windows、伺服器裝 Linux 各裝一次一樣。


6. 常用 self-check 指令(釐清你現在是哪一套)

在 PowerShell(Windows):

rustc -vV

看 host 是否為 x86_64-pc-windows-msvc(或你安裝的 windows target)。

在 WSL2 Ubuntu:

rustc -vV

host 應為 x86_64-unknown-linux-gnu(或對應架構)。

檢查已安裝的 target:

rustup target list --installed

7. 一句話總結


延伸閱讀(官方概念)

在 GitHub 看原文