Can Rust code compile without the standard library?
The Rust standard library is in fact separated into three distinct crates:
core
, which is the glue between the language and the standard library. All types, traits and functions required by the language are found in this crate. This includes operator traits (found incore::ops
), theFuture
trait (used byasync fn
), and compiler intrinsics. Thecore
crate does not have any dependencies, so you can always use it.alloc
, which contains types and traits related to or requiring dynamic memory allocation. This includes dynamically allocated types such asBox<T>
,Vec<T>
andString
.std
, which contains the whole standard library, including things fromcore
andalloc
but also things with further requirements, such as file system access, networking, etc.
If your environment does not provide the functionality required by the std
crate, you can choose to compile without it. If your environment also does not provide dynamic memory allocation, you can choose to compile without the alloc
crate as well. This option is useful for targets such as embedded systems or writing operating systems, where you usually won't have all of the things that the standard library usually requires.
You can use the #![no_std]
attribute in the root of your crate to tell the compiler to compile without the standard library (only core
). Many libraries also usually support "no-std
" compilation (e.g. base64
and futures
), where functionality may be restricted but it will work when compiling without the std
crate.
When you're not using std
, you rely on core
, which is a subset of the std
library which is always (?) available. This is what's called a no_std
environment, which is commonly used for some types of "embedded" programming. You can find more about no_std
in the Rust Embedded book, including some guidance on how to get started with no_std
programming.