前言:为什么需要交叉编译?

想象一下这样的场景:你在 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)​​ 是一组数据库操作的逻辑单元,这些操作要么​​全部成功执行​​,要么​​全部失败回滚​​,以确保数据库从一个一致状态转换到另一个一致状态。事务是关系型数据库&…