我正在尝试设置一个与dueboot非常相似的项目。也就是说,Rust在嵌入式ARM上。现在,我只是编写Rust代码,但我无法编译它。
我基本上已经从该项目中复制了防锈代码,但我并不完全理解lang_items
功能。
#![feature(asm)]
#![feature(lang_items)]
#![feature(no_std)]
#![no_std]
use arduino::{init, delay, pinMode, digitalWrite, analogWrite, LOW, HIGH, OUTPUT};
mod arduino;
#[lang="sized"]
trait Sized {}
#[lang="copy"]
trait Copy {}
#[lang="sync"]
trait Sync {}
static PWM:u32 = 2;
static LED:u32 = 11;
#[no_mangle]
pub fn main() {
// ...
}
尝试按上述方法编译代码会导致此错误:
main.rs:11:1: 11:15 error: parameter `Self` is never used
main.rs:11 trait Sized {}
^~~~~~~~~~~~~~
main.rs:14:1: 14:14 error: parameter `Self` is never used
main.rs:14 trait Copy {}
^~~~~~~~~~~~~
main.rs:17:1: 17:14 error: parameter `Self` is never used
main.rs:17 trait Sync {}
^~~~~~~~~~~~~
error: aborting due to 3 previous errors
我还试图评论与lang_items
相关的所有行,包括顶部的要素行。这是产生的错误消息:
// more lines of the same message
error: requires `sized` lang_item
error: requires `sized` lang_item
error: requires `sized` lang_item
error: requires `sized` lang_item
error: requires `sized` lang_item
error: aborting due to 54 previous errors
我正在使用从大师那里建造的铁锈,截至昨天。
有什么建议吗?
答案 0 :(得分:3)
几天前,Rust添加了所有类型参数必须出现在特征方法(RFC 738)中的规则。但由于Sized
(以及Copy
和Sync
)没有自己的任何方法,因此默认情况下会违反此规则。
官方解决方法是将特征标记为PhantomFn
,这会使错误无效:
#![feature(asm)]
#![feature(lang_items)]
#![feature(no_std)]
#![no_std]
use arduino::{init, delay, pinMode, digitalWrite, analogWrite, LOW, HIGH, OUTPUT};
mod arduino;
// Copied from <http://doc.rust-lang.org/core/marker/trait.PhantomFn.html>
#[lang="phantom_fn"]
trait PhantomFn<A: ?Sized, R: ?Sized = ()> {}
#[lang="sized"]
trait Sized: PhantomFn<Self> {}
#[lang="copy"]
trait Copy: PhantomFn<Self> {}
#[lang="sync"]
trait Sync: PhantomFn<Self> {}
static PWM:u32 = 2;
static LED:u32 = 11;
#[no_mangle]
pub fn main() {
// ...
}
此更改应使代码再次编译。
lang item 是一个标记为编译器“特殊”的符号。一些例子是:
堆分配器
在panic
确保类型安全的类型和特征,例如Send
和Drop
以及PhantomData
运营商重载的特征,例如Add
和Eq
以及Deref
您可以在lang_items.rs
中找到它们的列表。
这些项对语言的语义至关重要,但在编译器本身中实现是不切实际的。所以我们将它们放在标准库中,使用特殊的注释告诉编译器它们在哪里。
现在,虽然您可以自己定义这些项目,但建议您链接到core
,它会为您声明这些项目。但是我不确定这对你的设置有多好。