4个版本
0.4.5 | 2023年5月22日 |
---|---|
0.4.4 | 2023年5月22日 |
0.4.2 | 2023年5月22日 |
0.4.1 | 2023年5月22日 |
153 在 无标准库
每月36次下载
29KB
529 行
no-std-compat2
这是一个 #![no_std]
兼容层,可以使将您的crate移植到no_std变得 简单。
从no-std-compat2版本0.2.0开始默认支持稳定的Rust(见问题#2)。
为什么存在这个
在Rust中,您可以选择禁用标准库(见这里)。这样做将移除正常的std
标准库,并添加core
,可选地还可以添加alloc
以用于需要内存分配的事物。使用core
+ alloc
的结果类似于std
,并且许多使用std
的事物已经可以“移植”到使用core
+ alloc
。
但每个用Rust编写的 库 都需要更新。这是因为通常使用std
。使用core需要有人打破常规,通常只通过功能标志。这与Web Assembly进行比较,在那里几乎只有几个低级crate如rand
需要关心,因为尽管某些功能在那里不起作用,但一切仍然在std
下。
今天许多迁移到#![no_std]
的crate都会写一个名为std
的小模块,它将libcore和liballoc一起转发导入。这些努力应该被 统一。如果我们中的每个人都无需解决和找出如何修复相同的错误,那么我们将变得更加强大。
使用方法
这个库的设计宗旨是尽可能少地使用代码行数,以便能够将其复制粘贴到多个不同的库中。我的目标是让更多的crate与#![no_std]
兼容。同时,它也考虑支持std,以及支持no std,意味着你只需要很少的条件编译属性。
示例可以在example-crates/
文件夹中找到。
1. 在Cargo.toml中添加此crate,并启用任何需要的功能(见下一节)。
Cargo.toml
:
[dependencies]
no-std-compat2 = { version = "...", features = [ "alloc" ] }
2. 可选地,添加一个std
标志,这将引入整个标准库并绕过此兼容性crate。这对于可以使用标准库进行调试和提供额外功能的人来说很有用。下面的代码可选将std
功能也添加到no-std-compat2
中,使其仅链接到标准库。
Cargo.toml
:
[features]
default = [ "std" ] # Default to using the std
std = [ "no-std-compat2/std" ]
3. 启用no_std
,并将此crate重命名为std
导入。这确保了所有旧的导入在no_std
上仍然有效。即使你想使用std,启用no_std
也是可以的——no-std-compat2
会在发送正确的功能标志时自动引入std。当然,你在这里也可以使用除了"std"之外的任何名称。但这是我的建议。
src/lib.rs
:
#![no_std]
extern crate no_std_compat2 as std;
4. 在所有文件中导入预导入。这是因为在不支持std的环境中,rust会移除std的导入,而只导入core预导入。也就是说:目前它不会自动导入alloc预导入。这也导入了一些宏和其他所需的东西。
src/**.rs
:
use std::prelude::v1::*;
可选功能
alloc
:此功能引入alloc
并将其暴露在所有常规位置。即std::collection
映射到alloc::collections
,并且所有分配的内容都会添加到预导入中。std
:此功能引入整个标准库并覆盖所有其他功能。这实际上绕过了此crate。这里提供此功能是为了避免需要功能门:只需将你的可选std
功能转发到这里,我们处理其余部分。unstable
:此功能还重新导出所有不稳定模块,除非使用nightly编译,否则无法实现。除非你需要不稳定模块,此crate支持稳定的rust。compat_hash
:此功能引入hashbrown(这不是HashDoS-resistant!!但#![no_std])。其目的是让那些拥有标准库的人可以继续使用标准安全的HashMap,对于那些没有标准库的人来说,可以退回到一个不太理想的替代方案。但是,请注意,如果在公共函数签名中使用,可能会造成混淆,可能需要避免。但这取决于你!compat_sync
:此功能引入spin并为std::sync
中使用的几个东西提供替代方案。compat_macros
:此功能添加了没有任何功能的占位符实现,如println
、eprintln
、dbg
等。其目的是让任何不是库功能所必需的调试函数或其他日志记录在no_std
中保持沉默。
贡献
更新胶水
你是否拉取了这个存储库,并发现它已经过时了?幸运的是,这个存储库已经准备好了。胶水可以通过一个Python脚本来简单地重新生成。
确保你在某处下载了Rust源代码。使用rustup,这不是问题。
rustup component add rust-src
现在你可以运行 ./generate.py > src/generated.rs
。如果它选择了错误的Rust版本或者完全崩溃,你可以使用 --src
手动指定源目录。就这么简单。当然,如果你忘记了参数名称,也可以运行 ./generate.py --help
。
更新功能列表
如果Rust抱怨某个功能被要求但未指定,或者可能抱怨某个功能未被使用,这是因为某些导入位于功能门之后,而功能门是会变化的。通常情况下,这只是一个简单地将内容添加或删除到 src/lib.rs
中的长长行中,该行指定了功能。这通常只在使用 unstable
功能时会出现问题。
依赖关系
~170–760KB
~13K SLoC