找不到目标 thumbv7em-none-eabihf 的 sin()、cos()、log10()(浮点数)

sin(), cos(), log10() (float) not found for target thumbv7em-none-eabihf

我正在使用 Rust 1.51 和这个最小的箱子:

#![no_std]

fn main() {
    let a = 2.0.cos();
}

我正在用 cargo check --target thumbv7em-none-eabihf 构建它,编译器抱怨此消息:no method named 'cos' found for type '{float}' in the current scopesin()log10().

相同

我找到了 https://docs.rust-embedded.org/cortex-m-quickstart/cortex_m_quickstart/,我希望上面的消息是针对目标 thumbv6m-none-eabithumbv7em-none-eabi 而不是针对具有 FPU 支持的 thumbv7em-none-eabihf

我该如何解决这个问题?

在 Rust 1.51(及更低版本)中,sincoslog10 等函数不是核心库(core::)的一部分,而只是标准库库 (std::),因此它们不可用。

一个实用的解决方案是使用 crate libm,它为 no_std 环境提供典型的数学函数。

#![no_std]

fn main() {
    let a = libm::cosf(2.0);
}

参见:

@phip1611 说的是正确的,cos 不再是核心库的一部分,因此不能在开箱即用的 no_std 中使用。您可以直接使用 libm,也可以使用启用了 libm 功能的 num-traits crate,通过标准友好包装器使用。这使您可以像编写 std 代码一样编写 no_std 代码。例如

# cargo.toml
num-traits = { version = "0.2", default-features = false, features = ["libm"] }

然后在您的代码中:

#![no_std]

#[allow(unused_imports)]
use num_traits::real::Real;

fn main() {
    let a = 2.0.cos();
}