Cross Compiling: libcore
If you get an
error: can't find crate for 'core', you’re probably compiling for a different target (e.g. you’re passing the
target option to
cargo build). Now the compiler complains that it can’t find the
core library. This document gives a quick overview how to fix this problem. For more details, see the rust-cross project.
The core library is a dependency-free library that is added implicitly when using
#![no_std]. It provides basic standard library features like Option or Iterator. The core library is installed together with the rust compiler (just like the std library). But the installed libcore is specific to your architecture. If you aren’t working on x86_64 Linux and pass
‑‑target x86_64‑unknown‑linux‑gnu to cargo, it can’t find a x86_64 libcore. To fix this, you can either use
If you’re using a custom target specification, the
rustup method doesn’t work. Instead, you can use xargo. Xargo is a wrapper for cargo that eases cross compilation. We can install it by executing:
cargo install xargo
If the installation fails, make sure that you have
cmake and the OpenSSL headers installed. For more details, see the xargo’s dependency section.
Xargo is “a drop-in replacement for cargo”, so every cargo command also works with
xargo. You can do e.g.
xargo clean, or
xargo doc. However, the
build command gains additional functionality:
xargo build will automatically cross compile the
core library (and a few other libraries such as
alloc) when compiling for custom targets.
So if your custom target file is named
your-cool-target.json, you can compile your code using xargo through
xargo build --target your-cool-target (note the omitted extension).