为armv5te-unknown-linux-gnueabi交叉编译Rust共享库遇链接错误求助
问题描述
构建参数
- 源环境:x86_x64 Windows 10 或 x86_x64 Linux(Ubuntu WSL)
- 目标平台:armv5te Linux(运行Ev3dev系统的乐高Mindstorm)
- 目标类型:cdylib
- 目标glibc版本:2.24
- 开发语言:Rust
- 构建工具:cargo
- 编译器:rustc
Cargo配置
[package] name = "ev3" version = "0.1.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] jni = "0.19" ev3dev-lang-rust = { version = "0.12.1", features=["screen"]} jni_proc_macro= {path= "./jni_proc_macro"} [lib] crate-type= ["cdylib"] [workspace] members= ["jni_proc_macro"]
构建配置(.cargo/config.toml)
[build] target = "armv5te-unknown-linux-gnueabi" [target.armv5te-unknown-linux-gnueabi] linker = "rust-lld"
构建错误
error: linking with `rust-lld` failed: exit code: 1 | = note: {...} = note: rust-lld: error: unable to find library -lgcc_s rust-lld: error: unable to find library -lutil rust-lld: error: unable to find library -lrt rust-lld: error: unable to find library -lpthread rust-lld: error: unable to find library -lm rust-lld: error: unable to find library -ldl rust-lld: error: unable to find library -lc error: could not compile `ev3` due to previous error
求助问题
A. 是否存在其他可成功构建的方式?
B. 如何解决这些依赖缺失问题?
最终需生成适用于armv5te Linux的.so共享库。
解决方案
A. 替代构建方式
- 使用GNU交叉编译工具链
放弃rust-lld直接链接,改用针对armv5te的GNU交叉编译工具链,这是嵌入式Linux交叉编译的标准方案,兼容性更强,能自动处理系统依赖。 - 直接在Ev3设备上本地构建
通过SSH连接Ev3设备,在设备上安装Rust环境与cargo,直接本地编译生成目标.so文件,完全规避交叉编译的依赖匹配问题。
B. 解决依赖缺失问题
方案1:配置GNU交叉编译工具链(推荐)
- 安装交叉工具链
在Ubuntu WSL环境下,执行以下命令安装针对armv5te的交叉编译工具链:
该工具链包含链接所需的sudo apt update && sudo apt install gcc-arm-linux-gnueabilibc、libgcc_s等全部系统库,且版本与Ev3dev的glibc 2.24匹配。 - 修改构建配置
更新.cargo/config.toml,将链接器替换为交叉工具链的gcc:
配置完成后,cargo会调用GNU交叉链接器自动查找对应架构的系统库,解决缺失问题。[build] target = "armv5te-unknown-linux-gnueabi" [target.armv5te-unknown-linux-gnueabi] linker = "arm-linux-gnueabi-gcc"
方案2:为rust-lld指定系统库路径
若坚持使用rust-lld,需手动提供armv5te架构的系统库:
- 获取Ev3dev系统库
通过SSH从Ev3设备上拷贝/lib和/usr/lib目录下的所有库文件到本地目录(如./armv5-libs)。 - 配置rust-lld的库路径
在.cargo/config.toml中添加rustflags指定库路径:
此方式需手动维护库文件版本,适配性较差,仅作为备选方案。[target.armv5te-unknown-linux-gnueabi] linker = "rust-lld" rustflags = [ "-L", "./armv5-libs/lib", "-L", "./armv5-libs/usr/lib", ]
额外注意事项
- 确保交叉工具链的glibc版本与Ev3dev的2.24匹配,若Ubuntu默认包版本不符,可从Ev3dev官方镜像源获取对应工具链。
- 对于本地依赖
jni_proc_macro,需确保其也支持armv5te架构的交叉编译,必要时为其单独配置目标编译参数。
内容的提问来源于stack exchange,提问作者RedCrafter LP
相关产品推荐
相关产品推荐

