无法使用no_std / lang_items编译Rust

时间:2015-02-21 17:51:17

标签: rust

我正在尝试设置一个与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

我正在使用从大师那里建造的铁锈,截至昨天。

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

几天前,Rust添加了所有类型参数必须出现在特征方法(RFC 738)中的规则。但由于Sized(以及CopySync)没有自己的任何方法,因此默认情况下会违反此规则。

官方解决方法是将特征标记为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

  • 上展开的程序
  • 确保类型安全的类型和特征,例如SendDrop以及PhantomData

  • 运营商重载的特征,例如AddEq以及Deref

您可以在lang_items.rs中找到它们的列表。

这些项对语言的语义至关重要,但在编译器本身中实现是不切实际的。所以我们将它们放在标准库中,使用特殊的注释告诉编译器它们在哪里。

现在,虽然您可以自己定义这些项目,但建议您链接到core,它会为您声明这些项目。但是我不确定这对你的设置有多好。