找不到目标 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 scope
。 sin()
和 log10()
.
相同
我找到了 https://docs.rust-embedded.org/cortex-m-quickstart/cortex_m_quickstart/,我希望上面的消息是针对目标 thumbv6m-none-eabi
或 thumbv7em-none-eabi
而不是针对具有 FPU 支持的 thumbv7em-none-eabihf
。
我该如何解决这个问题?
在 Rust 1.51(及更低版本)中,sin
、cos
或 log10
等函数不是核心库(core::
)的一部分,而只是标准库库 (std::
),因此它们不可用。
一个实用的解决方案是使用 crate libm
,它为 no_std
环境提供典型的数学函数。
#![no_std]
fn main() {
let a = libm::cosf(2.0);
}
参见:
- libm 箱子:https://crates.io/crates/libm
- 关于将数学函数移动到核心库的讨论https://github.com/rust-lang/rfcs/issues/2505
@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();
}
我正在使用 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 scope
。 sin()
和 log10()
.
我找到了 https://docs.rust-embedded.org/cortex-m-quickstart/cortex_m_quickstart/,我希望上面的消息是针对目标 thumbv6m-none-eabi
或 thumbv7em-none-eabi
而不是针对具有 FPU 支持的 thumbv7em-none-eabihf
。
我该如何解决这个问题?
在 Rust 1.51(及更低版本)中,sin
、cos
或 log10
等函数不是核心库(core::
)的一部分,而只是标准库库 (std::
),因此它们不可用。
一个实用的解决方案是使用 crate libm
,它为 no_std
环境提供典型的数学函数。
#![no_std]
fn main() {
let a = libm::cosf(2.0);
}
参见:
- libm 箱子:https://crates.io/crates/libm
- 关于将数学函数移动到核心库的讨论https://github.com/rust-lang/rfcs/issues/2505
@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();
}