Rust 交叉编译:Windows ====> Linux (musl 静态编译)

1 核心简介

使用 cargo-zigbuild 工具,进行 从 Windows 到 Linux contos 的交叉编译,采用 musl 版本的 Linux 程序(静态编译) 的方式。

本次教程是 Windows 10/11 原生环境 下操作,不需要安装 WSL、不需要安装 Linux 虚拟机、不需要配置 Docker,纯 Windows 环境直接完成编译,所有步骤都是 Windows 平台专属的精准操作,无任何模糊表述。

  1. 编译目标:Linux CentOS 全版本通用的 musl 纯静态二进制程序(CentOS 7/8/9 x86_64 完美兼容,CentOS Stream 也支持)
  2. 编译特性:100% 纯静态链接,编译产物无任何系统依赖(不依赖 glibc、不依赖 musl 库、不依赖任何.so 动态文件),在 CentOS 上无需安装任何依赖包,上传即可运行,这是 CentOS 部署的最佳方式(CentOS 7 的 glibc 版本低,动态编译的程序大概率运行报错,musl 静态编译完美解决这个痛点)
  3. 核心工具 :cargo-zigbuild + zig 工具链,这是 Windows 交叉编译 Rust 到 Linux 最稳定、最简单的方案,没有之一
  4. 编译产物:Linux 系统的 ELF 可执行文件(无.exe 后缀),可直接在 CentOS x86_64 服务器运行

2 核心原理

  1. Rust 官方的 x86_64-unknown-linux-musl 目标,在 Windows 上直接用 cargo build 编译会失败,因为缺少 Linux 平台的链接器、musl 标准库;
  2. zig 工具链内置了全平台的编译 / 链接工具链,包括 Linux musl 的完整编译环境,无需我们手动安装任何 Linux 相关依赖;
  3. cargo-zigbuild 本质是对 原生 cargo 的封装,自动调用 zig 的 链接器编译器,替我们完成所有交叉编译的底层配置,我们只需要执行简单的命令即可;
  4. 最终编译出的 musl 版本程序,是 Linux 平台的纯静态二进制,不仅兼容 CentOS,还兼容 Ubuntu、Debian、Alpine 等所有 Linux 发行版。

3 前置 环境配置

  • Rust 开发环境(含 cargo)
  • Zig 工具链(cargo-zigbuild 的核心依赖,必须装)
  • cargo-zigbuild 核心编译工具

1、安装 Rust 环境

step1: 安装 系统依赖(二选一)

Rust 需要调用系统的 **C/C++ 编译器(链接器)**来工作。

Windows 上 最省心 的是安装 MinGW-w64,不想装大软件的可以选 Visual Studio Build Tools。

方案一:安装 MSYS2 (MinGW-w64) ------ 轻量

这是目前 Windows 上开发 Rust 最主流的配置方式,安装包小,配置简单。

  1. 下载 MSYS2 安装包并安装。
  2. 安装完成后,打开 MSYS2 MSYS 终端(开始菜单里找)。
  3. 输入以下命令安装编译工具(输入时右键是粘贴):
bash 复制代码
pacman -S mingw-w64-ucrt-x86_64-gcc
  1. 等待安装完成,关闭窗口。这一步完成后,你的系统 PATH 环境变量通常已经自动配置好了,无需手动操作。

方案二:安装 Visual Studio Build Tools ------ 微软官方,适合做 Windows 应用

如果你以后打算用 Rust 调用 Windows API 或开发桌面应用,这个兼容性最好。

  1. 下载 Visual Studio C++ 生成工具。
  2. 运行安装程序,勾选 "使用 C++ 的桌面开发"。
  3. 点击安装(这一步很大,约 1-2GB,安装完建议重启电脑)。

step2: 配置 环境变量

由于 Rust 官方服务器在海外,直接下载大概率会失败。我们需要临时修改环境变量,使用国内镜像(推荐清华源或中科大源

  1. 在 Windows 搜索栏输入"环境变量",选择 "编辑系统环境变量" -> "环境变量"。
  2. 在"用户变量"或"系统变量"中,新建以下两个变量:
变量名 变量值
RUSTUP_DIST_SERVER https://rsproxy.cn
RUSTUP_UPDATE_ROOT https://rsproxy.cn/rustup

step3: 安装 Rust

  1. 下载安装包:访问 Rust 官网安装页,点击下载 rustup-init.exe (Windows 64-bit)。

  2. 运行安装:

    • 双击运行下载好的 rustup-init.exe。
    • 在弹出的黑框(PowerShell/CMD)中,输入 1 并回车,选择 默认安装 (Proceed with installation)。
  3. 等待:安装程序会自动从国内镜像下载 Rust 编译器 (rustc)、包管理器 (cargo) 和文档。这个过程需要几分钟。

  4. 验证

    打开一个新的 CMD 或 PowerShell,输入以下命令:

sh 复制代码
cargo --version
rustc --version

2、安装 Zig 工具链

Zig 是 cargo-zigbuild 的核心依赖,没有 Zig,cargo-zigbuild 会直接报错 zig not found。

版本建议:安装 0.11.x / 0.12.x 稳定版,不建议用最新的开发版,兼容性最好

step1: Zig 官方下载地址:https://ziglang.org/download/

上面的网址下载速度十分慢,可以用第三方 Zig 国内镜像站(专门同步了 Zig 的下载资源,速度很快),以及中国科学技术大学镜像站作为备用:

  1. 优先推荐:Zig 专属国内镜像(直接下载你需要的版本)
    你要的 Windows x86_64 版本(zig-windows-x86_64-0.12.0.zip) 直接下载链接:
    https://zigmirror.hryx.net/zig/zig-windows-x86_64-0.12.0.zip
  2. 备用:中国科学技术大学镜像站(资源全,稳定)
    中科大镜像站也同步了 Zig 的资源,对应链接:
    https://mirrors.ustc.edu.cn/zig/dist/0.12.0/zig-windows-x86_64-0.12.0.zip

这两个链接都是国内节点,下载速度会比官方快很多~

step2: 下载包

找到 Windows 平台的下载包,选择 x86_64-windows 版本(比如 zig-windows-x86_64-0.12.0.zip)

step3: 添加 环境变量

下载后,解压这个压缩包到无中文、无空格的路径(Windows 大坑!路径有中文 / 空格会导致后续编译失败),推荐路径:C:\zig

解压后,C:\zig 目录下能直接看到 zig.exe 即可.

  • 打开系统环境变量(Win+R → sysdm.cpl → 高级 → 环境变量)
  • 在【用户变量】的 Path 变量中,点击【编辑】→【新建】,输入路径:C:\zig
  • 点击【确定】保存所有环境变量

step4: 验证 Zig 安装成功

sh 复制代码
zig version

3、安装 cargo-zigbuild 核心编译工具

step1: 安装

是标准的 Cargo 子命令,安装后全局可用。

打开【管理员身份】的 PowerShell,执行安装命令。

sh 复制代码
cargo install cargo-zigbuild

step2: 验证

sh 复制代码
cargo install --list

后续升级 cargo-zigbuild 只需执行:

sh 复制代码
cargo install --force cargo-zigbuild

4 进行 交叉编译

注意: Rust 项目路径【必须无中文、无空格、无特殊符号】这是 Windows 交叉编译的最大坑之一,90% 的编译报错都源于此!

启动编译

执行下面的命令 进行 Windows ===> Linux 的交叉编译

sh 复制代码
cargo zigbuild --release --target x86_64-unknown-linux-musl

编译过程

  • 首次编译会下载对应的 rust-std 标准库(musl 版本),大概几十 MB,国内镜像源速度很快
  • 编译过程中会看到 zig cc、zig ld.lld 的日志,这是正常的,说明 cargo-zigbuild 正在调用 zig 的编译器 / 链接器
  • 编译完成后,无任何报错,最后会显示 Finished release [optimized] target(s) in XXmXXs
  • 编译时间:取决于你的项目大小,小项目几秒,中大型项目几分钟

编译产物

编译完成后,所有产物都在你的 Rust 项目根目录下的 target 文件夹中,精准路径是:

bash 复制代码
你的项目根目录\target\x86_64-unknown-linux-musl\release\

产物文件说明:

  1. 该目录下,有一个和你的项目名同名、无任何后缀的文件,这个就是最终的 Linux 纯静态二进制程序(ELF 格式)
    • 例如:项目名是 my_app,产物就是 my_app(无.exe),这个文件就是我们要上传到 CentOS 服务器的文件
  2. 该目录下的其他文件(如 .pdb、.rlib)都是编译中间产物,无需理会,只需要拷贝这个无后缀的二进制文件即可
  3. 示例路径:D:\rust_projects\my_centos_app\target\x86_64-unknown-linux-musl\release\my_centos_app

5 带 C/C++ 依赖的 Rust 项目

很多 Rust 项目会依赖 C/C++ 编写的原生库,比如 openssl、libsqlite3-sys、ring、lz4、zstd 等,这类项目在 Windows 上交叉编译到 Linux 时,原生 cargo 会直接编译失败,但用 cargo-zigbuild 则完美解决!

cargo-zigbuild 会 自动检测项目中的 C/C++ 依赖,自动调用 zig 的 C 编译器 完成 C/C++ 代码的交叉编译,自动链接到最终的二进制文件中,无需任何额外配置,无需手动编译 C 库,编译命令和纯 Rust 项目完全一样:

bash 复制代码
# 带C/C++依赖的项目,编译命令不变,还是这一行
cargo zigbuild --release --target x86_64-unknown-linux-musl

这是 cargo-zigbuild 对比其他交叉编译方案的最大优势,也是为什么它是 Rust 交叉编译 的 首选工具!

6 常见报错 + 解决方案

整理了 Windows 下使用 cargo-zigbuild 编译时的 所有高频报错,按报错频率排序,每一个报错都有精准的原因和解决方案,遇到问题直接查这里即可,无需到处找答案!

❌ 报错 1:error: zig: command not found

  • 原因:Zig 未安装,或 Zig 的路径未添加到环境变量,或环境变量未生效
  • 解决方案:
    确认 Zig 解压路径是 C:\zig,且 zig.exe 存在
    重启 PowerShell(环境变量修改后必须重启)
    重新执行 zig version 验证

❌ 报错 2:linker error: file not found / error: could not compile xxx

  • 原因:99% 是 项目路径有中文 / 空格 / 特殊符号,Windows 下的链接器不支持中文路径
  • 解决方案:把项目复制到纯英文路径(如 D:\rust_projects\my_app),重新编译即可解决

❌ 报错 3:failed to download rust-std for x86_64-unknown-linux-musl

  • 原因:Rust 镜像源未配置,下载超时
  • 解决方案:回到步骤 1,重新配置 RUSTUP_DIST_SERVER 和 RUSTUP_UPDATE_ROOT 环境变量,重启 PowerShell 后重新编译

❌ 报错 4:permission denied 权限不足

  • 原因:PowerShell 没有管理员权限,无法写入文件
  • 解决方案:右键 PowerShell → 以管理员身份运行,重新执行编译命令

❌ 报错 5:CentOS 上运行程序提示 No such file or directory,但文件明明存在

  • 原因:这是 Linux 的经典坑,不是文件不存在,而是动态编译的程序依赖的 glibc 版本不够(CentOS7 的 glibc 版本低)
  • 解决方案:回到 Windows 重新编译 musl 静态版本,就是我们本次教程的方式,编译完成后重新上传即可解决

❌ 报错 6:编译时内存占用过高,PowerShell 卡死

  • 原因:Rust 编译默认使用多核,Windows 内存不足
  • 解决方案:编译时指定并行线程数,减少内存占用:
bash 复制代码
cargo zigbuild --release --target x86_64-unknown-linux-musl -j 4

-j 4 表示用 4 个线程编译,根据你的电脑内存调整(8G 内存用 4,16G 内存用 8)

相关推荐
!执行2 小时前
高德地图 JS API 在 Linux 系统的兼容性解决方案
linux·前端·javascript
玖釉-2 小时前
[Vulkan 学习之路] 09 - 显卡的流水线工厂:图形管线概览 (Graphics Pipeline)
c++·windows·图形渲染
张心独酌2 小时前
Rust新手练习案例库- rust-learning-example
开发语言·后端·rust
晋人在秦 老K3 小时前
Windows 7还能用!VxKex实现Edge浏览器及现代应用兼容方案
windows·edge·win7系统兼容性修复·api扩展工具·老旧系统运行新软件·dll缺失错误解决·兼容性调试方案
love530love3 小时前
EPGF 新手教程 22教学模板不是压缩包:EPGF 如何设计“可复制、可检查、可回收”的课程模板?
ide·人工智能·windows·python·架构·pycharm·epgf
程序员南飞3 小时前
列表对象排序
windows
Xの哲學3 小时前
Linux SKB: 深入解析网络包的灵魂
linux·服务器·网络·算法·边缘计算
cui__OaO3 小时前
Linux内核--基于正点原子IMX6ULL开发板的内核移植
linux·嵌入式
我想发发发3 小时前
Linux实现虚拟串口通信-socat
linux·运维·服务器