{"id":14991984,"url":"https://github.com/DaviRain-Su/rust-no-std-source","last_synced_at":"2025-09-25T14:30:36.962Z","repository":{"id":140131404,"uuid":"384843140","full_name":"DaviRain-Su/rust-no-std-source","owner":"DaviRain-Su","description":"About Rust no std sources","archived":false,"fork":false,"pushed_at":"2021-12-13T15:19:38.000Z","size":847,"stargazers_count":15,"open_issues_count":1,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-16T12:53:51.188Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/DaviRain-Su.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-07-11T02:17:51.000Z","updated_at":"2024-10-29T07:53:28.000Z","dependencies_parsed_at":null,"dependency_job_id":"9afd8073-0739-42fa-a53d-c109a0c55ec5","html_url":"https://github.com/DaviRain-Su/rust-no-std-source","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/DaviRain-Su/rust-no-std-source","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DaviRain-Su%2Frust-no-std-source","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DaviRain-Su%2Frust-no-std-source/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DaviRain-Su%2Frust-no-std-source/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DaviRain-Su%2Frust-no-std-source/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DaviRain-Su","download_url":"https://codeload.github.com/DaviRain-Su/rust-no-std-source/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DaviRain-Su%2Frust-no-std-source/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":276932060,"owners_count":25730715,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-25T02:00:09.612Z","response_time":80,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-09-24T15:00:37.747Z","updated_at":"2025-09-25T14:30:36.654Z","avatar_url":"https://github.com/DaviRain-Su.png","language":"Rust","funding_links":[],"categories":["Summary"],"sub_categories":[],"readme":"# rust-no-std-source\n\u003e About Rust no std sources\n\n\n# 题目: 改写std的库为支持no_std的库及写出一个支持std和no_std库的经验谈\n\n\u003e首先简单介绍std和no_std的区别，  \n然后介绍使用no_std库方式， 由于支持no_std的特性有两种不同的方式，\n因此使用no_std库也有两种方式。\n如何验证一个库是否支持no_std特性的验证方式，\n如何改写一个std库为支持std和no_std的特性的方法。\n具体的如何写一个支持std和no_std的库。\n一些在std和no_std下都可以使用的primitive的仓库和相关的资源和文章。\n\n\n\n# 目录\n\n- std和no_std的区别\n- Rust中使用no_std库的两种方式\n- 验证一个库是否支持no_std特性的验证方式\n- 具体的写一个支持std和no_std的库\n- 一些no_std和std可以使用primitive类型的仓库和相关资源的文章\n\n\n\n\n\n## 1. std 和 no_std 的区别\n\n\u003e ### 核心库\n\u003e\n\u003e Rust语言的语法由核心库和标准库共同提供。\n\u003e 其中Rust核心库是标准库的基础。核心库中定义的是Rust语言的核心，不依赖于操作系统和网络等相关的库，甚至不知道堆分配，也不提供并发和I/O\n\u003e\n\u003e 可以通过在模块顶部引入#![no_std]来使用核心库。核心库和标准库的功能有一些重复，包括如下部分：\n\u003e - 基础的trait，如Copy、Debug、Display、Option等。\n\u003e - 基本原始类型，如bool、char、i8/u8、i16/u16、i32/u32、i64/u64、isize/usize、f32/f64、str、array、slice、tuple、pointer等。\n\u003e - 常用功能型数据类型，满足常见的功能性需求，如String、Vec、HashMap、Rc、Arc、Box等。\n\u003e - 常用的宏定义，如println！、assert！、panic！、vec！等。\n\u003e 做嵌入式应用开发的时候，核心库是必需的。\n\u003e\n\u003e ### 标准库\n\u003e\n\u003e Rust标准库提供应用程序开发所需要的基础和跨平台支持。标准库包含的内容大概如下：\n\u003e - 与核心库一样的基本trait、原始数据类型、功能型数据类型和常用宏等，以及与核心库几乎完全一致的API。\n\u003e - 并发、I/O和运行时。例如线程模块、用于消息传递的通道类型、Sync trait等并发模块，文件、TCP、UDP、管道、套接字等常见I/O。\n\u003e - 平台抽象。os模块提供了许多与操作环境交互的基本功能，包括程序参数、环境变量和目录导航；路径模块封装了处理文件路径的平台特定规则。\n\u003e - 底层操作接口，比如 std：：mem、std：：ptr、std：：intrinsics 等，操作内存、指针、调用编译器固有函数。\n\u003e - 可选和错误处理类型Option和Result，以及各种迭代器等。\n\n\n[引用自The Embedonomicon](https://docs.rust-embedded.org/embedonomicon/smallest-no-std.html)\n`#![no_std]`是一个crate level 级别的属性，\n表示该core crate将链接到core crate而不是std crate，\n但这对应用程序来说意味着什么呢？\n\nstd crate是Rust的标准库。\n它包含的功能假定程序将在操作系统上运行，\n而不是直接在裸系统上运行。\nstd还假定操作系统是一个通用的操作系统，\n就像人们在服务器和台式机上看到的那样。\n出于这个原因，std为通常在这类操作系统中发现的功能提供了一个标准的API: 线程、文件、套接字、文件系统、进程等等。\n\n另一方面，core crate是std crate 的一个子集，\n对程序运行的系统不做任何假设。\n因此，它提供了基本语言的API，如浮点、字符串和切片，\n以及暴露处理器特性的API，如原子操作和SIMD指令。\n然而，它缺乏涉及堆内存分配和I/O的任何API。\n\n对于一个应用程序来说，\nstd所做的不仅仅是提供一种访问操作系统抽象的方式，\nstd还负责设置堆栈溢出保护，处理命令行参数，\n以及在程序的主函数被调用之前生成主线程。\n一个`#![no_std]`应用程序缺乏所有这些标准的运行时间，\n所以它必须初始化自己的运行时间，如果需要的话。\n\n由于这些特性，`#![no_std]`应用程序可以是第一个和/或唯一在系统上运行的代码。它可以成为许多标准的Rust应用程序所不可能成为的东西，例如。\n- 操作系统的内核。\n- 固件。\n- 引导器。\n\n\n## 2. Rust中no_std的一些使用方法\n\n参见4: 具体的写一个no_std的库\n\n实例:[serde no-std的使用规范](https://serde.rs/no-std.html)\n\n## 3. 验证一个库是否支持no_std的验证方式\n\n`\ncargo check --target wasm32-unknown-unknown\n`\n\n但是wasm环境不一定就是no_std，或者别的编译目标也可以，也就是裸露的编译目标环境不带有任何系统的环境。\n\n参考文档: [使用Rust编写操作系统（一）：独立式可执行程序](https://zhuanlan.zhihu.com/p/53064186)\n\n\n## 4. 具体的写一个no_std的库\n\n### 创建一个no_std库的第一种方式 (使用#![no_std])\n\n使用#![no_std]的话，默认的就是这个库是在no_std环境下的，然而又因为no_std下的库\n一般来说都是核心库，而核心库又是标准库的子集，所以声明#![no_std]写出来的库，也可以在\nstd（标准库环境）下使用。\n\n1. [创建一个仓库](https://github.com/DaviRain-Su/rust-no-std-source/commit/cd90f28855cfe794c235976bb58c1c5ecb8c7fa9)\n\n2. [使用#![no_std]将这个仓库中的函数能支持在no_std和std下使用](https://github.com/DaviRain-Su/rust-no-std-source/commit/d3c05920865a44ab7cbaf82a72f21c7b6b8beeb0)\n\n3. [开始添加一个函数编译报错commit 1](https://github.com/DaviRain-Su/rust-no-std-source/commit/8bcd0b909ee116d3dc9c6464c2548e1c008d672e)\n\n4. [修复错误commit 2](https://github.com/DaviRain-Su/rust-no-std-source/commit/ae94f9cf147b7ce37632cb4e9c36e20c5135b3ad)\n\n\n### 创建no_std库的第二种方式(使用#![cfg_attr(not(feature = \"std\"), no_std))\n\n1. [创建一个仓库](https://github.com/DaviRain-Su/rust-no-std-source/commit/8cfd063be536028d9f8cfe1c7c04f16765825f8c)\n2. [使用#![cfg_attr(not(feature = \"std\"), no_std)]](https://github.com/DaviRain-Su/rust-no-std-source/commit/aa09b0d2e2807d788564aea5fa4fc8cbfc760043)\n3. [添加的一些函数和测试](https://github.com/DaviRain-Su/rust-no-std-source/commit/aa09b0d2e2807d788564aea5fa4fc8cbfc760043)\n\n## 5 使一些不能在no_std环境下运行的仓库也能在no_std下支持\n\n[相关的Pr,使ics23支持no_std](https://github.com/confio/ics23/pull/41)\n\n[有些代码也在no_std写测试很难。因为这里做了编译选择处理](https://github.com/confio/ics23/pull/41/commits/dac5c3d0fc368e0b92c4a4804b6787bd1c3fb168)\n\n\n## 6. 一些no_std和std可以使用的primite类型仓库\n\n- [sp-std](https://github.com/paritytech/substrate/tree/master/primitives/std)\n- [rust Alloc crate](https://doc.rust-lang.org/alloc/index.html)\n- [rust Core crate](https://doc.rust-lang.org/core/index.html)\n\n## 7, pallet-node-template 可以测试是否支持no_std特性\n- [pallet-node-template](https://github.com/DaviRain-Su/pallet-node-template)\n\n\n\n## 引用\n\n[rust编程之道核心库和标准库的介绍](https://weread.qq.com/web/reader/0303203071848774030b9d6k9bf32f301f9bf31c7ff0a60)\n\n[rust embeded book](https://docs.rust-embedded.org/book/intro/no-std.html)\n\n[扩展no_std crate的最佳实践](https://users.rust-lang.org/t/best-practice-of-extending-a-no-std-crate/12281/5)\n\n[Rust API guidelines](https://github.com/rust-lang/api-guidelines)\n\n[Rust API Guidelines Naming](https://rust-lang.github.io/api-guidelines/naming.html#c-feature)\n\n[serde no-std的使用规范](https://serde.rs/no-std.html)\n\n[awesome-embedded-rust#no-std-crates](https://github.com/rust-embedded/awesome-embedded-rust#no-std-crates)\n\n[no standard library](https://crates.io/categories/no-std)\n\n[serde使用的第二种方式](https://github.com/serde-rs/serde/blob/master/serde/src/lib.rs#L113-L193)\n\n[Rust RFC Book no_std](https://rust-lang.github.io/rfcs/1184-stabilize-no_std.html)\n\n[Rust no-std DAQ](https://justjjy.com/Rust-no-std)\n\n[testing-for-no-std-compatibility](https://blog.dbrgn.ch/2019/12/24/testing-for-no-std-compatibility/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FDaviRain-Su%2Frust-no-std-source","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FDaviRain-Su%2Frust-no-std-source","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FDaviRain-Su%2Frust-no-std-source/lists"}