You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust编译AArch64架构PIE库及跨Crate使用问题解决

正确编译AArch64架构PIE Rust库并跨项目使用

环境信息

  • 系统:Ubuntu 20.04 x86_64
  • Rust版本:rustc 1.69.0-nightly
  • 目标平台:aarch64-unknown-none-softfloat(已安装对应rust-std组件)

问题重现与分析

1. PIE库(libtest)编译问题

libtest的src/lib.rs代码:

#![feature(restricted_std)]                        

pub fn add(left: usize, right: usize) -> usize {
    left + right
}

pub fn output(i: usize) {
    println!("i:{}", i);
}

Cargo.toml配置:

[package]                                                               
name = "libtest"
version = "0.1.0"
edition = "2021"

[dependencies]

[lib]
crate-type = ["lib"]
version = "0.1.0"

最初编译错误

执行命令:

cargo build --lib --target=aarch64-unknown-none-softfloat -Clink-args="-pie"

报错:

warning: unused manifest key: lib.version
Compiling libtest v0.1.0 (/home/user/libtest)
error[E0463]: can't find crate for std
|
= note: the aarch64-unknown-none-softfloat target may not support the standard library
= note: std is required by libtest because it does not declare #![no_std]
= help: consider building the standard library from source with cargo build -Zbuild-std

error: cannot find macro println in this scope
--> src/lib.rs:8:5
|
8 | println!("i:{}", i);
| ^^^^^^^

error[E0635]: unknown feature restricted_std
--> src/lib.rs:1:12
|
1 | #![feature(restricted_std)]
| ^^^^^^^^^^^^^^

错误原因:

  • lib.version是无效字段,Cargo的[lib]段不支持version配置
  • aarch64-unknown-none-softfloat属于无标准库目标,默认没有std,需通过-Zbuild-std编译std
  • restricted_std特性在1.69.0-nightly中不存在,无需启用

修正后编译成功

执行命令:

cargo rustc --target aarch64-unknown-none-softfloat --release -Zbuild-std -- -Clink-args="-pie"

生成文件:libtest/target/aarch64-unknown-none-softfloat/release/liblibtest.rlib

2. 在pie_test项目中使用libtest的问题

pie_test的src/main.rs代码:

extern crate libtest;                                                                                                   
fn main() {
    println!("Hello, world!");
    let a = libtest::add(1, 2); 
    println!("finish test {}", a); 
}

Cargo.toml配置:

[package]                                                                                                               
name = "pie_test"
version = "0.1.0"
edition = "2021"

[dependencies]
libtest = { path = "./liblibtest.rlib" }

目录结构:

├── Cargo.lock
├── Cargo.toml
├── liblibtest.rlib
├── rust-toolchain.toml
└── src
    └── main.rs

编译错误1(rustc命令)

执行命令:

rustc src/main.rs --target aarch64-unknown-none-softfloat --extern libtest=./liblibtest.rlib

报错:

error[E0463]: can't find crate for std
|
= note: the aarch64-unknown-none-softfloat target may not support the standard library
= note: std is required by <unknown> because it does not declare #![no_std]
= help: consider building the standard library from source with cargo build -Zbuild-std

error[E0463]: can't find crate for std which libtest depends on
--> src/main.rs:1:1
|

extern crate libtest;
^^^^^^^^^^^^^^^^^^^^^ can't find crate

= note: the aarch64-unknown-none-softfloat target may not support the standard library
= help: consider building the standard library from source with cargo build -Zbuild-std

error: cannot find macro println in this scope
--> src/main.rs:5:5
|
5 | println!("finish test {}", a);
| ^^^^^^^

error: cannot find macro println in this scope
--> src/main.rs:3:5
|
3 | println!("Hello, world!");
| ^^^^^^^

error: #[panic_handler] function required, but not found

error: aborting due to 5 previous errors

错误原因:目标平台无默认std,rustc本身不支持-Zbuild-std,需通过Cargo调用编译std

编译错误2(cargo build命令)

执行命令:

cargo build --target aarch64-unknown-none-softfloat

报错:

error: failed to get libtest as a dependency of package pie_test v0.1.0 (/home/user/pie_test)

Caused by:
failed to load source for dependency libtest

Caused by:
Unable to update /home/user/pie_test/liblibtest.rlib

Caused by:
failed to read /home/user/pie_test/liblibtest.rlib/Cargo.toml

Caused by:
Not a directory (os error 20)

错误原因:Cargo的path依赖需指向包含Cargo.toml的源码目录,而非编译后的.rlib文件

正确解决方案

步骤1:修正libtest库的配置

修改libtest/Cargo.toml,移除[lib]段中的无效version字段:

[package]                                                               
name = "libtest"
version = "0.1.0"
edition = "2021"

[dependencies]

[lib]
crate-type = ["lib"]

移除src/lib.rs中的无效特性声明:

pub fn add(left: usize, right: usize) -> usize {
    left + right
}

pub fn output(i: usize) {
    println!("i:{}", i);
}

步骤2:重新编译libtest库

执行命令:

cd libtest
cargo rustc --target aarch64-unknown-none-softfloat --release -Zbuild-std -- -Clink-args="-pie"

步骤3:正确配置pie_test项目依赖

修改pie_test/Cargo.toml,将libtest的依赖指向其源码目录(假设libtest与pie_test同级):

[package]                                                                                                               
name = "pie_test"
version = "0.1.0"
edition = "2021"

[dependencies]
libtest = { path = "../libtest" }

步骤4:编译pie_test项目

执行命令:

cd pie_test
cargo build --target aarch64-unknown-none-softfloat --release -Zbuild-std

可选:直接使用已编译的.rlib文件

若必须使用预编译的.rlib,需通过Cargo间接调用rustc并指定std依赖:

cd pie_test
cargo rustc --target aarch64-unknown-none-softfloat --release -Zbuild-std --extern libtest=./liblibtest.rlib -- -Clink-args="-pie"

内容的提问来源于stack exchange,提问作者si yan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 20:23:09