您现在的位置是:首页 >其他 >借助Zig交叉编译Rust项目网站首页其他

借助Zig交叉编译Rust项目

瓜皮小王子 2025-03-13 18:15:07
简介借助Zig交叉编译Rust项目

借助Zig交叉编译Rust项目

前言

Rust 项目有时会依赖 C/C++ 库,这给交叉编译带来了额外的挑战。Zig 不仅是一个优秀的交叉编译器,还内置了 C/C++ 编译器,可以完美解决这个问题。借助 Zig,我们可以轻松地为依赖 C/C++ 的 Rust 项目进行交叉编译。

Zig简介

Zig 是一种通用的编程语言和工具链,用于维护健壮高效可重用的软件。值得一提的是Zig自带强大的编译器,支持的目标平台非常广泛,覆盖了主流操作系统和处理器架构,可以将Zig作为一个零依赖的,支持开箱即用交叉编译的 C/C++ 编译器,并且支持指定glibc版本。zig工具链的体积远小于常规的gcc编译器。

Zig的主要特点:

  • 简单易学: Zig 语法简洁明了,易于学习和使用。
  • 高性能: Zig 编译生成的代码性能优异,可与 C 语言媲美。
  • 内存安全: Zig 提供了强大的内存安全机制,可以有效避免内存错误。
  • 跨平台: Zig 支持多种操作系统和硬件架构,可以轻松地进行跨平台开发。
  • 强大的工具链: Zig 内置了构建系统、包管理器、测试框架等工具,可以极大地提高开发效率。

Zig 的劣势:

  • 生态系统还不够成熟: Zig 的生态系统还在发展中,可用的库和工具相对较少。
  • 社区规模较小: Zig 的社区规模相对较小,获取帮助和支持的渠道有限。

使用zig编译带C/CPP的Rust项目

使用zig作为c编译器和链接器将项目编译到 aarch64-linux-musl 目标平台

  • 设置zig wrapper

zcc wrapper

$ zig cc -target aarch64-linux-musl $@

zcxx wrapper

$ zig cxx -target aarch64-linux-musl $@

build.rs

fn main() {
    cc::Build::new()
    .cpp(false)
    .file("./add.c")
    .compile("add");

    println!("cargo:rustc-link-lib=add");
    println!("cargo:rustc-link-search=native=.");
}

main.rs

extern "C" {
    fn add(a: i32, b: i32) -> i32;
}

fn main() {
    unsafe {
        println!("1 + 2 = {}", add(1, 2));
    }
}

add.c

int add(int a, int b) {
    return a + b;
}

cargo-zigbuild

一个使用zig作为链接器编译Cargo项目的工具

安装

使用cargo

cargo install --locked cargo-zigbuild

使用pip

pip install cargo-zigbuild

使用方法

  1. 安装zig(通过在ziglang官网下载或其他方式)
  2. 通过rustup安装target
  3. 运行cargo zigbuild
cargo zigbuild --target aarch64-unknown-linux-gnu

支持给zigbuild传递指定的glibc版本

cargo zigbuild --target aarch64-unknown-linux-gnu.2.17

优势

  • 兼容 cargo build 命令
  • 支持指定glibc版本
  • 轻量小巧

参考文献

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。