当前位置: 首页 > news >正文

静态交叉编译rust程序

📜 问题背景

最近,我尝试在一部 aarch64 架构、运行着 Ubuntu 18.04 系统的设备上安装和使用 Helix 编辑器。Ubuntu 18.04 是一个相对较老的发行版,其 glibc 版本(2.27)也比较低。

我在安装过程中遇到了两个主要障碍:

  1. Snap 版本:通过 snap 安装的 Helix 版本,在运行时遇到了各种权限问题,导致无法正常访问系统上的文件。

  2. Prebuilt Binary(预编译版本):从 GitHub Releases 下载的 aarch64 预编译二进制文件,在运行时直接报错,提示 glibc 版本不兼容。这是因为官方构建通常依赖于一个比 Ubuntu 18.04 更新的 glibc 版本。

为了绕过这些问题,唯一的出路似乎就是自己动手:为这个特定的目标平台(aarch64-linux)构建一个静态链接的 Helix 版本。

💡 解决方案:musl 交叉静态编译

我们的目标是生成一个不依赖宿主机 glibc 的二进制文件。最好的方法就是使用 musl libc 进行交叉编译。musl 是一个轻量级的 C 语言标准库实现,非常适合用于创建可移植的静态二进制文件。

我们将使用一个 x86_64 的 Linux 主机作为构建环境,交叉编译出目标 aarch64-unknown-linux-musl 的可执行文件。

以下是完整的实战步骤。

🛠️ 实战步骤

1. 准备交叉编译工具链

首先,我们需要一个能生成 aarch64-linux-musl 代码的交叉编译工具链(包括 GCC, ar 等)。musl.cc 社区提供了非常好用的预编译包。

Bash

# 下载工具链
wget https://more.musl.cc/11.2.1/x86_64-linux-musl/aarch64-linux-musl-cross.tgz# 解压到一个合适的位置,例如 /opt/
sudo mkdir -p /opt/aarch64-cross
sudo tar -xvzf aarch64-linux-musl-cross.tgz -C /opt/aarch64-cross# 将工具链的 bin 目录添加到 PATH
# 你可以将其加入到 .bashrc 或 .zshrc 中以便永久生效
export PATH="/opt/aarch64-cross/bin:$PATH"# 验证一下是否成功
aarch64-linux-musl-gcc -v
2. 添加 Rust 编译目标

接下来,我们需要告诉 rustup(Rust 的工具链管理器)我们打算编译到 aarch64-unknown-linux-musl 目标。

Bash

rustup target add aarch64-unknown-linux-musl
3. 配置 Cargo 链接器

为了让 Cargo 在构建 aarch64-unknown-linux-musl 目标时使用我们刚刚下载的交叉编译工具链,我们需要在 Helix 项目的根目录下创建一个 .cargo/config.toml 文件。

首先,克隆 Helix 源码(如果你还没有的话):

Bash

git clone https://github.com/helix-editor/helix.git
cd helix

然后,创建并编辑 .cargo/config.toml 文件:

Bash

mkdir -p .cargo
nano .cargo/config.toml

config.toml 文件中添加以下内容,告诉 Cargo 使用哪个 linkerar

Ini, TOML

[target.aarch64-unknown-linux-musl]
linker = "aarch64-linux-musl-gcc"
ar     = "aarch64-linux-musl-ar"
4. 指定 Rust 链接标志

这一步是可选的,但有助于确保我们得到一个更纯粹的静态二进制文件。musl 目标默认已经是静态链接 C 库了,但我们可以通过 RUSTFLAGS 进一步控制链接行为。

Bash

export RUSTFLAGS="-C target-feature=-crt-static"

编者注:此标志用于指定 CRT(C 运行时)的链接特性。musl 目标本身就旨在解决 glibc 依赖问题。

如果你的目标是生成一个完全不依赖任何外部 .so 文件的二进制文件(包括 libc.so 之外的其他 C 库),你可能需要尝试使用 +crt-static 标志来强制启用完整的静态链接:

export RUSTFLAGS="-C target-feature=+crt-static"

在大多数 musl 场景下,默认行为(不设置此 RUSTFLAGS)或使用 +crt-static 是更常见的选择。

5. 开始构建

一切准备就绪!现在可以开始构建了。

Bash

# 确保你在 helix 项目的根目录
# 使用 --release 标志来获取一个优化的版本
cargo build --target aarch64-unknown-linux-musl --release

这个过程会花费一些时间,Cargo 会下载所有依赖并从头开始编译它们。

🚀 部署和验证

编译成功后,你可以在以下路径找到你的静态二进制文件:

./target/aarch64-unknown-linux-musl/release/hx

你可以使用 file 命令来验证它:

Bash

$ file ./target/aarch64-unknown-linux-musl/release/hxhx: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV),
statically linked, BuildID[...], not stripped

注意看,statically linked!这正是我们想要的。

现在,将这个 hx 文件复制到你的 aarch64 Ubuntu 18.04 设备上(例如使用 scp),赋予它执行权限,然后运行它。

Bash

# 在你的构建机上
scp ./target/aarch64-unknown-linux-musl/release/hx user@your-aarch64-device:~/# --- 切换到你的 aarch64 设备上 ---
chmod +x ~/hx
mv ~/hx /usr/local/bin/hx# 运行!
hx

至此,Helix 应该能在那台老旧的 Ubuntu 18.04 设备上完美运行了,彻底告别了 glibc 依赖地狱。

总结

面对 glibc 版本不兼容这个 Linux 上的“老大难”问题时,使用 musl 进行静态编译无疑是“银弹”。虽然配置交叉编译环境的步骤稍显繁琐,但它一劳永逸地解决了二进制文件在不同发行版之间的可移植性问题。

http://www.dtcms.com/a/573334.html

相关文章:

  • 1.2.STM32简介——全程手敲板书
  • 2.2.6【2020统考真题】
  • Doris 并入CMP7(类Cloudera CDP 7.3.1 404华为鲲鹏ARM版)的方案和实施源代码
  • Vue3项目实战:从0到1开发企业级中后台系统(3):架构核心!手把手封装Axios、Pinia、Router
  • Spark on Yarn安装部署
  • 建设系统网站怎么做自然优化
  • 国产化数据库选型深度剖析:金仓KES与达梦DM全生命周期成本对比
  • Java 读取 Word 文本框中的文本和图片:Spire.Doc for Java 实践指南
  • 网站建设开发定制微信网站如何做
  • 商城项目业务总结
  • 安卓16提前发布能否改写移动生态格局
  • JVM :内存、性能调优与 JIT
  • JVM问题排查流程
  • 仲恺做网站wordpress屏蔽功能org
  • AI视频创作工具汇总:MoneyPrinterTurbo、KrillinAI、NarratoAI、ViMax
  • 部署我的世界-java版服务器-frp内网穿透
  • Eureka 注册中心原理与服务注册发现机制
  • Unity使用RVM实现实时人物视频抠像(无绿幕)
  • 物联网传感器环境自适应校准与精度补偿技术
  • 【低空安全】低空安防威胁与挑战
  • 微网站建设包括哪些iis5.1怎么新建网站
  • 45_AI智能体核心业务之Agent决策流程管理器:构建智能对话系统的工作流引擎
  • wordpress api定制济南seo公司案例
  • vscode运行ipynb文件:使用docker中的虚拟环境
  • 网站布局有哪些企业网站源码怎么获取
  • 如何科学地对单片机进行AI性能测试:指标、方法与实战
  • 软件设计师-树-叶子结点个数
  • 饭店网站模板北京网站制作郑州
  • 小型企业网站建设公司株洲网上房地产
  • 数据中台的核心功能包含哪些?基本思路建设思路是什么?