在 macOS 上跨平台编译 Rust 应用程序至 Linux 和 Windows

在 macOS 上跨平台编译 Rust 应用程序至 Linux 和 Windows

在 Rust 开发中,能够从单一开发环境(如 macOS)为不同操作系统生成可执行文件是一项强大且实用的技能。本文将指导您如何在 macOS 系统上分别构建适用于 Linux 和 Windows 的 Rust 应用程序,并介绍两种主要的实现方法。

第一种方式:本地安装依赖并编译

编译为 Linux 可执行文件

  1. 安装 Musl Cross-Compiler: 利用 Homebrew 安装 Musl 交叉编译器套件以支持在 macOS 上为 Linux 构建。

    bash 复制代码
    brew install FiloSottile/musl-cross/musl-cross
  2. 配置 Rust 目标平台 : 使用 rustup 添加 x86_64 架构 Linux(基于 Musl C 库)的目标平台。

    bash 复制代码
    rustup target add x86_64-unknown-linux-musl
  3. 项目链接器设置 : 在项目的 .cargo/config.toml 文件中指定 Musl 链接器路径。

    toml 复制代码
    [target.x86_64-unknown-linux-musl]
    linker = "x86_64-linux-musl-gcc"
  4. 构建 Linux 版本项目: 执行以下命令进行编译,生成适用于 Linux 的 release 版本可执行文件。

    bash 复制代码
    cargo build --release --target x86_64-unknown-linux-musl

编译为 Windows 可执行文件

针对 Windows 平台,我们需要借助 cargo-xwin 工具及 LLVM 组件:

  1. 安装 cargo-xwin : 使用 cargo 命令行工具安装 cargo-xwin 插件。

    bash 复制代码
    cargo install cargo-xwin
  2. 安装 LLVM: 通过 Homebrew 获取 LLVM,确保 Windows 目标编译所需组件已就绪。

    bash 复制代码
    brew install llvm
  3. 更新环境变量 : 将 LLVM bin 目录添加到系统 PATH 中,使 cargo-xwin 能找到相关工具。

    bash 复制代码
    export PATH="/opt/homebrew/Cellar/llvm/17.0.6/bin:$PATH"
    source ~/.zshrc
  4. 添加 Windows 目标平台 : 使用 rustup 添加支持 x86_64 架构 Windows(使用 MSVC 工具链)的目标平台。

    bash 复制代码
    rustup target add x86_64-pc-windows-msvc
  5. 构建 Windows 版本项目 : 运行 cargo-xwin 来完成 Windows 版本的编译工作。

    bash 复制代码
    cargo xwin build --release --target x86_64-pc-windows-msvc

第二种方式:利用 cross 工具简化跨平台编译流程

使用 cross 实现 Docker 容器内编译

cross-rs/cross 是一个通过 Docker 容器技术优化跨平台编译过程的强大工具。其工作原理概括如下:

  1. 准备容器环境 : 根据目标平台(Linux 或 Windows),cross 自动下载或创建包含对应平台构建工具链、Rust 工具和必要库的 Docker 镜像。

  2. 挂载源代码至容器 : 当运行 cross 命令时,会自动将本地项目源码目录映射到 Docker 容器内部。

  3. 容器内部编译cross 根据目标平台在容器内部调用相应的 Rust 工具链进行编译。

  4. 同步结果至主机: 编译完成后,生成的二进制文件存储于容器内的特定路径,并通过 Docker 卷映射功能回传至宿主 macOS 系统。

使用 cross 进行编译步骤

首先,通过 Cargo 安装 cross

bash 复制代码
cargo install cross

然后,在项目根目录下配置 Cross.toml 文件,考虑到国内网络问题,可以自定义镜像地址:

toml 复制代码
[target.x86_64-unknown-linux-gnu]
xargo = false
image = "togettoyou/ghcr.io.cross-rs.x86_64-unknown-linux-gnu:main"

[target.x86_64-pc-windows-gnu]
xargo = false
image = "togettoyou/ghcr.io.cross-rs.x86_64-pc-windows-gnu:main"

最后,运行 cross 命令编译 Windows 版本应用:

bash 复制代码
cross build -r --target x86_64-pc-windows-gnu

成功编译后,可在项目 target 目录下找到相应平台的可执行文件。

参考资料:

相关推荐
SuniaWang1 分钟前
《Spring AI + 大模型全栈实战》学习手册系列 · 专题六:《Vue3 前端开发实战:打造企业级 RAG 问答界面》
java·前端·人工智能·spring boot·后端·spring·架构
韩立学长4 分钟前
Springboot校园跑腿业务系统0b7amk02(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
sheji34169 分钟前
【开题答辩全过程】以 基于springboot的扶贫系统为例,包含答辩的问题和答案
java·spring boot·后端
A_nanda44 分钟前
根据AI提示排查vue前端项目
前端·javascript·vue.js
happymaker06261 小时前
web前端学习日记——DAY05(定位、浮动、视频音频播放)
前端·学习·音视频
代码栈上的思考1 小时前
消息队列:内存与磁盘数据中心设计与实现
后端·spring
~无忧花开~1 小时前
React状态管理完全指南
开发语言·前端·javascript·react.js·前端框架
LegendNoTitle2 小时前
计算机三级等级考试 网络技术 选择题考点详细梳理
服务器·前端·经验分享·笔记·php
@大迁世界2 小时前
1.什么是 ReactJS?
前端·javascript·react.js·前端框架·ecmascript
程序员小假2 小时前
我们来说一下 b+ 树与 b 树的区别
java·后端