无法使用 no_std/lang_items 编译 Rust

2024-02-03

我正在尝试建立一个非常类似于的项目dueboot https://github.com/jensnockert/dueboot。即嵌入式 ARM 上的 Rust。现在,我只完成了 Rust 代码的编译,但无法编译它。

我基本上完全从该项目中复制了 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

截至昨天,我正在使用 master 构建的 Rust。

有什么建议么?


几天前,Rust 添加了所有类型参数必须出现在 Trait 的方法中的规则(RFC 738 https://github.com/rust-lang/rfcs/blob/master/text/0738-variance.md)。但是由于Sized (and Copy and 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 项?

A 语言项是一个对编译器标记为“特殊”的符号。一些例子是:

  • 堆分配器

  • 平仓程序panic

  • 确保类型安全的类型和特征,例如Send and Drop and PhantomData

  • 运算符重载的特征,例如Add and Eq and Deref

您可以在以下位置找到它们的列表:lang_items.rs https://github.com/rust-lang/rust/blob/master/src/librustc/middle/lang_items.rs.

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

现在,虽然您可以自己定义这些项目,但建议链接到core http://doc.rust-lang.org/core/相反,它为您声明这些 lang 项。但我不确定这对你的设置效果如何。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法使用 no_std/lang_items 编译 Rust 的相关文章

随机推荐

  • 在 ASP.NET MVC 中组合和缩小 JS 和 CSS

    我创建了默认的 ASP NET MVC 3 Web 应用程序 然后我将三个 css 和三个 js 文件添加到 Views Shared Layout cshtml 视图中 Content Site css rel stylesheet ty
  • Google 地图 API 找不到 $(document).ready 中定义的回调

    我在使用 Jquery 和 Google 地图 API 时遇到问题 脚本似乎在 html 中正确定位
  • 在 R 中,如何访问因子每个级别的第一个元素?

    我有一个像这样的数据框 n c 2 2 3 3 4 4 n lt as factor n s c a b c d e f df data frame n s df n s 1 2 a 2 2 b 3 3 c 4 3 d 5 4 e 6 4
  • CSS 文件被阻止:MIME 类型不匹配(X-Content-Type-Options:nosniff)

    我正在开发一个 Angular 4 应用程序 我想应用一些全局样式 继角度站点的教程 https angular io tutorial toh pt5 global application styles 我在应用程序的根目录中创建了一个
  • Excel 2007 条件格式有 2 个条件,一个基于另一列

    我正在使用 Excel 2007 中的表格 我试图根据一列中的值及其状态 位于另一列中 以一种格式突出显示单元格 例如 我试图突出显示毛利润为负且状态为 IN 的所有单元格 仅单元格 而不是行 这样做的正确方法是什么 我尝试过 if 语句
  • 无法设置二维数组的属性“0”

    谁能告诉我为什么下面的代码会出现此错误 未捕获的类型错误 无法设置未定义的属性 0 var vehicles get poll index php data vehicles function data var rows data find
  • Spark:如何在每个执行器中创建本地数据帧

    在spark scala中有一种方法可以创建执行器中的本地数据帧 例如 pyspark 中的 pandas 在mappartitions方法中 我想将迭代器转换为本地数据帧 如python中的pandas数据帧 以便可以使用数据帧功能 而不
  • 用插值颜色填充阿基米德螺线之间的区域 - Matplotlib

    我想绘制如图所示的各种螺旋 一个螺旋在其他螺旋内部 假设我有三个螺旋 S1 S2 和 S3 我想填充连续螺旋之间的区域 即 S1 和 S2 S2 和 S3 之间的区域 最后是 S3 和 S1 之间的区域 我尝试了多种方法来解决以下两个问题
  • 取消列出数据框中已列出的列

    我有一个包含多个级别的列表 我希望将数据级别转换为数据帧 其中变量 chr 折叠为单个字符串 myList lt list total reach list 4 data list list reach 2 chr list A B C n
  • HTML 5 音频 .play() 在移动设备上的延迟

    我刚刚使用 socket io 构建了一个实时应用程序 其中 主 用户可以在接收设备 桌面浏览器 移动浏览器 上触发声音 该主用户会看到声音文件列表 并且可以在声音文件上单击 播放 音频播放在浏览器上是即时的 然而 在移动设备上 会出现 0
  • 无法在ExtJs中发送参数Ajax

    我在 View Extjs 中有代码 这是代码 var storeTree Ext create Ext data TreeStore proxy type ajax method POST url data newoss get pake
  • 使用或不使用“new”关键字创建 Mongoose 模式?

    我在网上看到的大多数例子都是这样做的 var UserSchema new mongoose Schema name String age String 然而 最近我发现一本书做了上述 但没有 new 关键字 var UserSchema
  • WCF Rest ERR_CONNECTION_RESET 响应不大

    错误代码绝对是可怕的 ERR CONNECTION RESET 有很多原因 我在其他问题上发现的原因与大型 Web 服务调用的 MaxRequestLength 太小有关 不过 我返回的数据只有几 kB 所以这不是问题 这是我的界面代码 W
  • 如何将 prettier 配置添加到 eslint 配置中?

    请注意 我不希望在我的 JS 项目中使用分号 Youtube 视频 https www youtube com watch v KfVPVmORnL4 我尝试在 eslintrc cjs 文件中禁用它 但奇怪的是semi 0无法禁用丢失警告
  • 如何在新进程中运行函数?

    现在我处于进程的线程之一A 我需要创建新流程B在当前线程中 并在进程中运行B功能MyFunc 我该怎么做 我找到了如何从当前进程创建子进程 click http msdn microsoft com en us library window
  • jqgrid - 添加新行并禁用restoreRow功能

    如果我要添加新行并且启用自动编辑新添加的行 那么我想执行验证并通过 ENTER 按钮保存行 但我不想通过 ESC 按钮恢复行 因为我设置了required true按所有字段 如果新添加的行将至少有一个字段为空 则按 ESC 按钮 rest
  • 如何将动态组件放入容器中

    我想创建动态组件并将这些组件的视图插入到容器中 我认为这可以通过以下方式实现视图容器引用 https angular io docs ts latest api core index ViewContainerRef class html
  • TypeError C 是未定义的数据表

    我试图将使用 ajax 获得的一些数据渲染到数据表中 但似乎我丢失了一些东西 因为它显示错误 TypeError c is undefined 我读过这篇文章 数据表类型错误 c 未定义 https stackoverflow com qu
  • 无论如何要将 Owin HTTPS 限制为 TLS 1.2?

    我想将我的 Webapi 锁定为 TLSv1 2 因此不允许使用 TLSv1 1 等 我看到了以下帖子 但它似乎只与 ASP NET Core 相关 有什么方法可以将 ASP NET Core 2 0 HTTPS 限制为 TLS 1 2 h
  • 无法使用 no_std/lang_items 编译 Rust

    我正在尝试建立一个非常类似于的项目dueboot https github com jensnockert dueboot 即嵌入式 ARM 上的 Rust 现在 我只完成了 Rust 代码的编译 但无法编译它 我基本上完全从该项目中复制了