Rust 在 Windows 環境下交叉編譯其他操作系統可執行文件的詳細指南

前言:為什么需要交叉編譯?

想象一下這樣的場景:你在 Windows 電腦上開發了一個 Rust 程序,希望它能在 Linux 服務器上運行,或者在朋友的 macOS 電腦上測試 —— 總不能為了編譯不同系統的版本,專門買一臺 Linux 或 macOS 設備吧?

這就是交叉編譯的價值:在一臺操作系統(如 Windows)上,直接編譯出能在其他操作系統(如 Linux、macOS)上運行的可執行文件。Rust 憑借其設計理念,對交叉編譯提供了極佳的支持,本指南將手把手教你如何在 Windows 環境下實現這一需求。

一、準備工作:搭建基礎環境

在開始交叉編譯前,我們需要先準備好基礎工具。這部分步驟只需做一次,后續所有交叉編譯都能復用。

1.1 安裝 Rust 環境

Rust 的官方工具?rustup?是管理 Rust 版本和工具鏈的核心,必須先安裝:

  1. 打開瀏覽器,訪問 Rust 官網:Install Rust - Rust Programming Language
  2. 點擊 "Download Rustup-init.exe (64-bit)" 下載安裝程序
  3. 運行下載的?rustup-init.exe,按照提示操作:
    • 推薦選擇 "1) Proceed with installation (default)"
    • 等待安裝完成,期間會自動配置環境變量

驗證安裝是否成功
打開 PowerShell 或命令提示符(CMD),輸入以下命令,能看到版本號即表示成功:

rustc --version  # 查看 Rust 編譯器版本
cargo --version  # 查看 Rust 包管理器版本

1.2 安裝輔助工具(推薦)

為了簡化后續工具鏈的安裝,推薦安裝一個 Windows 包管理器。這里以?Chocolatey?為例(類似 Linux 的?apt?或 macOS 的?brew):

  1. 以「管理員身份」打開 PowerShell,注意不是CMD,而是PowerShell。按Win+S鍵,查找PowerShell,再點擊以管理員身份打開。
  2. 復制粘貼以下命令并回車(這是 Chocolatey 的官方安裝腳本):
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))

安裝完成后,關閉并重新打開 PowerShell,輸入?choco --version?驗證是否可用

C:\WINDOWS\system32>choco --version
2.5.0

二、交叉編譯核心概念:先搞懂這些術語

在動手前,先了解幾個關鍵概念,避免后續操作中 "知其然不知其所以然":

  • 目標三元組(Target Triple)
    這是一個字符串,用來唯一標識目標平臺(即你要編譯到的操作系統)。格式為?架構-廠商-操作系統,例如:

    • x86_64-unknown-linux-gnu:64 位 x86 架構的 Linux 系統,使用 GNU 庫
    • aarch64-apple-darwin:ARM64 架構(如 M1/M2 芯片)的 macOS 系統
  • 工具鏈(Toolchain)
    針對特定目標平臺的編譯器、庫文件等工具的集合。Rust 通過?rustup?管理不同平臺的工具鏈。

  • 鏈接器(Linker)
    編譯后的代碼是 "零散的模塊",鏈接器的作用是將這些模塊與系統庫 "拼接" 成一個可執行文件。由于 Windows 的鏈接器不認識 Linux/macOS 的系統庫,因此需要安裝目標平臺專用的鏈接器。

  • 靜態鏈接 vs 動態鏈接

    • 動態鏈接:程序運行時依賴目標系統上的庫文件(如 Linux 的?libc.so),如果目標系統沒有這些庫,程序會報錯。
    • 靜態鏈接:將所有依賴的庫直接打包到可執行文件中,目標系統無需額外安裝庫,兼容性更好(推薦新手優先使用)。

三、實戰:編譯 Linux 可執行文件

Linux 是服務器端最常用的系統,我們先從編譯 Linux 程序開始,這也是交叉編譯中最容易實現的場景。

3.1 選擇目標平臺

根據你的需求選擇對應的目標三元組(常用選項如下):

目標平臺目標三元組特點
64 位 x86 Linux(動態)x86_64-unknown-linux-gnu依賴系統的 GNU 庫
64 位 x86 Linux(靜態)x86_64-unknown-linux-musl靜態鏈接,不依賴系統庫(推薦)
32 位 x86 Linuxi686-unknown-linux-gnu適用于舊設備
ARM64 Linux(如服務器)aarch64-unknown-linux-gnu適用于 ARM 架構的 Linux 服務器
ARMv7 Linux(如樹莓派)armv7-unknown-linux-gnueabihf適用于 Raspberry Pi 等設備

3.2 安裝目標平臺的 Rust 工具鏈

打開 PowerShell,輸入以下命令安裝你需要的目標工具鏈(以 64 位靜態鏈接為例):

# 安裝 64位 Linux 靜態鏈接工具鏈(推薦)
rustup target add x86_64-unknown-linux-musl# 如果需要其他平臺,替換為對應的三元組,例如:
# rustup target add aarch64-unknown-linux-gnu  # ARM64 Linux

3.3 安裝目標平臺的鏈接器

Rust 編譯后需要目標平臺的鏈接器來生成可執行文件,不同目標平臺對應不同的鏈接器:

情況 1:編譯靜態鏈接的 Linux 程序(musl)

musl 是一個輕量級的系統庫,支持靜態鏈接,推薦新手優先使用:

# 用 Chocolatey 安裝 musl 交叉工具鏈
choco install x86_64-unknown-linux-musl -y

安裝完成后,驗證工具是否可用:

x86_64-linux-musl-gcc --version  # 能看到版本號即表示成功
情況 2:編譯動態鏈接的 Linux 程序(gnu)

如果需要動態鏈接(依賴系統的 GNU 庫),安裝對應的 GNU 交叉工具鏈:

# 64位 x86 Linux
choco install mingw-w64-x86_64-linux-gnu -y# ARM64 Linux
choco install aarch64-linux-gnu-toolchain -y

3.4 配置 Cargo(告訴 Rust 用哪個鏈接器)

Rust 的包管理器?cargo?需要知道目標平臺的鏈接器路徑,我們通過配置文件指定:

  1. 進入你的 Rust 項目根目錄(如果沒有項目,先執行?cargo new my_project?創建一個)
  2. 在項目根目錄創建一個文件夾?.cargo(注意開頭有個點)
  3. 在?.cargo?文件夾里創建文件?config.toml,內容如下:
# 針對靜態鏈接的 Linux 平臺(musl)
[target.x86_64-unknown-linux-musl]
linker = "x86_64-linux-musl-gcc"  # 指定鏈接器# 如果需要其他平臺,添加對應的配置,例如:
# [target.aarch64-unknown-linux-gnu]
# linker = "aarch64-linux-gnu-gcc"

3.5 開始編譯

一切就緒后,在項目根目錄執行編譯命令:

# 編譯為 64位 Linux 靜態鏈接程序(release 模式優化)
cargo build --target x86_64-unknown-linux-musl --release
  • --target:指定目標平臺(即前面的三元組)
  • --release:生成優化后的版本(體積更小、運行更快)

編譯成功后
可執行文件會生成在?項目根目錄/target/x86_64-unknown-linux-musl/release/?文件夾下,文件名與你的項目名相同(不帶?.exe?后綴,這是 Linux 的特點)。

3.6 測試編譯結果

如何驗證編譯出的程序能在 Linux 上運行?有兩種簡單方法

  1. 使用 WSL(Windows Subsystem for Linux)
    如果你開啟了 WSL,直接將編譯好的文件復制到 WSL 環境中,執行?./文件名?即可運行。

  2. 上傳到 Linux 服務器
    通過 FTP 或?scp?命令將文件傳到 Linux 服務器,添加執行權限后運行:

chmod +x 文件名  # 添加執行權限
./文件名        # 運行程序

四、進階:編譯 macOS 可執行文件

macOS 的交叉編譯稍復雜,因為它需要蘋果的系統庫(SDK),但依然可以在 Windows 上實現。

4.1 安裝目標平臺工具鏈

# 64位 x86 macOS(如 Intel 芯片的 Mac)
rustup target add x86_64-apple-darwin# ARM64 macOS(如 M1/M2 芯片的 Mac)
rustup target add aarch64-apple-darwin

4.2 安裝 macOS 交叉編譯工具

需要安裝兩個核心工具:LLVM(編譯器框架)和 macOS SDK(系統庫):

1.安裝 LLVM

choco install llvm -y

2.獲取 macOS SDK
macOS SDK 是蘋果的專有文件,需要從合法渠道獲取(例如從你的 Mac 電腦中復制,或使用開源的適配版本)。
推薦使用預編譯的工具鏈包,內含 SDK:
下載地址:Releases · mstorsjo/llvm-mingw · GitHub
選擇包含?osx?的版本(如?llvm-mingw-xxx-windows-x86_64.zip),解壓到任意目錄(例如?C:\osxcross)。

4.3 配置 Cargo 和環境變量

1.在項目的?.cargo/config.toml?中添加:

# 針對 Intel 芯片 macOS
[target.x86_64-apple-darwin]
linker = "C:/osxcross/bin/x86_64-apple-darwin20.4-clang"  # 替換為你的實際路徑
ar = "C:/osxcross/bin/x86_64-apple-darwin20.4-ar"# 針對 M1/M2 芯片 macOS
[target.aarch64-apple-darwin]
linker = "C:/osxcross/bin/aarch64-apple-darwin20.4-clang"
ar = "C:/osxcross/bin/aarch64-apple-darwin20.4-ar"

2.設置環境變量(告訴工具鏈 SDK 的位置):
在 PowerShell 中執行:

# 替換為你的 SDK 實際路徑(解壓后的工具鏈中包含 SDK)
$env:SDKROOT = "C:/osxcross/sdk"
$env:MACOSX_DEPLOYMENT_TARGET = "10.15"  # 最低支持的 macOS 版本

4.4 編譯 macOS 程序

# 編譯為 Intel 芯片 macOS 程序
cargo build --target x86_64-apple-darwin --release# 或編譯為 M1/M2 芯片 macOS 程序
cargo build --target aarch64-apple-darwin --release

編譯產物位于?target/x86_64-apple-darwin/release/?或?target/aarch64-apple-darwin/release/?目錄下。


五、其他操作系統:FreeBSD 和 Android

5.1 編譯 FreeBSD 程序

FreeBSD 是類 Unix 系統,編譯步驟與 Linux 類似:

1.安裝目標工具鏈:

rustup target add x86_64-unknown-freebsd

2.安裝鏈接器:

choco install x86_64-unknown-freebsd12-gcc -y

3.配置?.cargo/config.toml

[target.x86_64-unknown-freebsd]
linker = "x86_64-unknown-freebsd12-gcc"

4.編譯:

cargo build --target x86_64-unknown-freebsd --release

5.2 編譯 Android 程序

Android 基于 Linux 內核,但需要使用 Android NDK(原生開發工具包):

1.安裝目標工具鏈(根據手機架構選擇):

# ARM64 手機(絕大多數現代 Android 設備)
rustup target add aarch64-linux-android

2.下載 Android NDK:
從?Android 開發者官網?下載 NDK,解壓到任意目錄(例如?C:\android-ndk)。

3.配置?.cargo/config.toml

[target.aarch64-linux-android]
linker = "C:/android-ndk/toolchains/llvm/prebuilt/windows-x86_64/bin/aarch64-linux-android30-clang"

(注意:30?是 Android API 級別,可根據需要修改)

4.編譯:

cargo build --target aarch64-linux-android --release

六、常見問題與解決方案

問題 1:鏈接器找不到(報錯 "linker?xxx?not found")

  • 原因:鏈接器未安裝,或未添加到系統 PATH 環境變量。
  • 解決
    1. 檢查工具鏈是否安裝成功(用?choco list --local-only?查看已安裝包)。
    2. 找到鏈接器的安裝路徑(例如?C:\ProgramData\chocolatey\bin),手動將其添加到系統 PATH。
    3. 重啟 PowerShell 后重試。

問題 2:編譯時提示 "缺少某個庫文件"

  • 原因:動態鏈接時,目標平臺的系統庫未找到。
  • 解決:優先使用靜態鏈接(如?x86_64-unknown-linux-musl?目標),避免依賴系統庫。

問題 3:macOS 編譯提示 "SDK not found"

  • 原因SDKROOT?環境變量未正確設置,或 SDK 路徑錯誤。
  • 解決:重新檢查?SDKROOT?路徑是否指向包含?SDKSettings.json?的文件夾(通常在?sdk/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk)。

七、自動化工具:讓交叉編譯更簡單

如果需要頻繁交叉編譯,可以使用工具簡化流程:

工具 1:cross(推薦)

cross?是 Rust 官方推薦的交叉編譯工具,自動處理工具鏈和鏈接器配置:

1.安裝?cross

cargo install cross

2.用?cross?編譯(用法與?cargo?類似):

# 編譯為 Linux 靜態鏈接程序
cross build --target x86_64-unknown-linux-musl --release

工具 2:GitHub Actions(自動化編譯)

如果你的項目托管在 GitHub,可以用 Actions 自動生成多平臺版本:

在項目根目錄創建?.github/workflows/cross-compile.yml?文件,內容如下:

name: 自動交叉編譯
on: [push]  # 每次推送代碼時觸發jobs:build-linux:runs-on: windows-lateststeps:- name: 拉取代碼uses: actions/checkout@v3- name: 安裝 Rustuses: actions-rs/toolchain@v1with:toolchain: stabletarget: x86_64-unknown-linux-musloverride: true- name: 安裝依賴run: choco install x86_64-unknown-linux-musl -y- name: 編譯 Linux 版本run: cargo build --target x86_64-unknown-linux-musl --release- name: 上傳編譯產物uses: actions/upload-artifact@v3with:name: linux-buildpath: target/x86_64-unknown-linux-musl/release/

提交后,GitHub 會自動編譯并保存產物,方便下載使用。


總結

Rust 在 Windows 下的交叉編譯并不復雜,核心步驟可以總結為:

  1. 安裝目標平臺的 Rust 工具鏈(rustup target add
  2. 安裝目標平臺的鏈接器(通過包管理器或手動下載)
  3. 配置 Cargo 指向鏈接器(.cargo/config.toml
  4. 執行編譯命令(cargo build --target ...

對于新手,建議從 Linux 靜態鏈接(musl)開始嘗試,成功率最高。掌握后再逐步擴展到 macOS、Android 等平臺。

通過交叉編譯,你可以在一臺 Windows 電腦上輕松支持多平臺,大大提升開發效率!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/95384.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/95384.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/95384.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Ubuntu系統配置鏡像源

要修改的文件 /etc/apt/sources.list操作步驟 1. 備份原文件 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak2. 編輯文件 sudo nano /etc/apt/sources.list3. 清空文件內容,填入以下內容 先獲取Ubuntu版本代號: lsb_release -cs然后根據版本填…

【Spring Cloud Alibaba】Sentinel(一)

【Spring Cloud Alibaba】Sentinel(一)1. 簡介2. 服務雪崩1. 簡介 Sentinel 是阿里巴巴開源的分布式系統的流量防護組件,主要用來做流量控制、熔斷降級、系統保護。它的定位類似于 Hystrix,但更側重在 流量治理 上。目前在微服務…

Delphi 5 操作Word表格選區問題解析

在 Delphi 5 中操作 Word 時,您遇到的 Selection.MoveDown 方法選中整行而不是僅移動一行的原因與 Word 的選擇機制和單元格內部結構有關。以下是詳細解釋和解決方案:問題分析單元格的選區范圍:當使用 .Cell(r, c).Select 選中單元格時&#…

小米fastboot不能被電腦識別但手機正常使用模式時能被電腦識別

小米手機USB連接電腦不識別解決方法 – MIUI歷史版本 小米手機USB連接電腦不識別解決方法 問題經驗 手機連接電腦通常會自動安裝驅動,如果驅動安裝失敗或是電腦不能識別手機設備,可嘗試下面方法。 1. 嘗試換根 USB 數據線,最好是手機原…

Git 版本管理工具基本操作匯總—命令總結

通常,很多朋友在使用 Git 的時候都會直接用 IDE 中集成的插件或者自帶的工具等來實現代碼的拉取、提交、合并以及其他操作,當然這肯定也是可以的,但是長期這樣子操作,我們就會忽略掉 Git 業務運行的底層邏輯。那么,我這…

自學嵌入式第三十三天:網絡編程-UDP

一、OSI模型(open system interconnect)開放系統互聯模型,分為7層應用層:為網絡用戶提供各種服務,例如電子郵件、文件傳輸等;表示層:為不同主機間的通信提供統一的數據表示形式。加密解密,壓縮;…

A*(Astar)算法詳解與應用

算法背景A*(A-Star)算法是一種在圖形平面上,有多個節點的路徑中,求出最低通過成本的算法。其歷史可以追溯到早期的圖搜索算法,如Dijkstra算法和貪心最佳優先搜索(Greedy Best-First Search)。是…

word刪除指定頁面

常規程序因為wps的 .docx 文件是基于段落和節的結構,而不是“物理頁”,所以無法直接按“第幾頁”刪除在普通程序里面無法讀取到他的頁碼,但是在宏編程里面他能讀取到頁碼,我們就根據宏編程來這樣刪除。程序會自動打開選擇要刪除的…

RK3568平臺開發系列講解:瑞芯微平臺4G模塊篇移植

更多內容可以加入Linux系統知識庫套餐(教程+視頻+答疑) ??返回專欄總目錄 文章目錄 一、硬件圖片 二、功能宏 三、增加PID/VID 支持 3.1、usb_device_id 結構體 3.2、usb_device_id 的注冊 沉淀、分享、成長,讓自己和他人都能有所收獲!?? 一、硬件圖片 目標: 結果…

面試 (一)

目錄 1. HashMap是怎么解決沖突的 是用什么數據結構實現的 2. 為什么hashmap的初始長度為16 3. 多線程的核心參數 4. 多線程怎么工作的 5. CISCS是怎么實現的 6. JUC知識 7. C和java的區別 8. JVM底層編譯的東西 9. 公平鎖和非公平鎖 10. 有人惡意攻擊你的平臺每秒發送…

計算機畢設選題:基于Python+Django的健康飲食管理系統設計【源碼+文檔+調試】

精彩專欄推薦訂閱:在 下方專欄👇🏻👇🏻👇🏻👇🏻 💖🔥作者主頁:計算機畢設木哥🔥 💖 文章目錄 一、項目介紹二…

vscode terminal遠程連接linux服務器GUI圖形界面

看了很多教程,不清楚具體原理,但總之自己是摸索出來了: 1.下載vcxsrv,最后雙擊exe程序啟動: 每一步的配置如下:2.修改配置 vscode中按下“ctrlshiftp”,然后輸入“Remote-SSH: Open SSH Configu…

文檔外發管理產品哪個品牌強?安全與效率雙優產品推薦

在企業間協作日益加深的今天,企業對文檔外發管理相關產品的安全性和效率要求越來越高。無論是日常業務協作,還是跨組織數據交換,如何確保文件在傳輸過程中不被泄露、篡改,同時又能高效流轉,成為企業IT管理的重要課題。…

【教程】2025 IDEA 快速創建springboot(maven)項目

第一步:【新建】-【module】,左邊選擇springboot,右邊填寫相關信息。第二步:選擇相關依賴。第三步:刪掉一些無關的文件,保持項目簡潔創建springboot項目已經結束了,下面是構建項目的架構以及環境…

【小白筆記】移動硬盤為什么總比電腦更容易滿?

我明明只復制了10個G的文件,為什么我的移動硬盤就滿了? 大家好,我是個剛入門的小白,最近遇到了一個讓我百思不得其解的問題。我把電腦里的一些文件,總共加起來也就10個G左右,心想移動硬盤還有幾十個G的空位…

單獨一篇云原生介紹

云原生(Cloud Native)?不是單一技術,而是一套構建和運行應用程序的完整方法論?,旨在充分利用云計算的優勢(彈性、按需資源、分布式環境)來構建?高韌性、可擴展、易于管理的應用?。它的核心思想是讓應用…

Git如何查看提交行數與刪除行數:統計代碼貢獻量的完整指南

Git如何查看提交行數與刪除行數:統計代碼貢獻量的完整指南 在軟件開發中,代碼行數統計是衡量團隊協作效率和項目進度的重要指標。通過Git的命令行工具,開發者可以輕松查看提交的代碼行數、刪除的代碼行數以及凈增行數。本文將詳細介紹多種方…

DVWA靶場通關筆記-SQL注入(SQL Injection Impossible級別)

目錄 一、源碼分析 1、index.php 2、impossible.php 二、SQL注入防范分析 1、Anti-CSRF 令牌 2、參數化查詢 3、輸入驗證 本系列為通過《DVWA靶場通關筆記》的SQL Injection 關卡(low,medium,high,impossible共4關)滲透集合…

MySQL中事務的作用和定義

在 MySQL 中,??事務(Transaction)?? 是一組數據庫操作的邏輯單元,這些操作要么??全部成功執行??,要么??全部失敗回滾??,以確保數據庫從一個一致狀態轉換到另一個一致狀態。事務是關系型數據庫&…