15

I'm using Rust 1.35.0 to try out some Rust examples and I could not get it to compile, as I keep getting the following message:

error[E0463]: can't find crate for `core`

I ran rustc --explain E0463 and I see the following message:

You need to link your code to the relevant crate in order to be able to use it
(through Cargo or the `-L` option of rustc example). Plugins are crates as
well, and you link to them the same way.

Here is my Cargo.toml:

[package]
name = "sensor-node"
version = "0.1.0"
authors = ["joesan <email@gmail.com>"]
edition = "2018"

[dependencies]
dwm1001 = "0.1.0"
panic-halt = "0.2.0"
nb = "0.1.1"

Here is my main.rs:

fn main() {
    let s = String::from("hello");  // s comes into scope

    takes_ownership(s);             // s's value moves into the function...
                                    // ... and so is no longer valid here

    let x = 5;                      // x comes into scope

    makes_copy(x);                  // x would move into the function,
                                    // but i32 is Copy, so it’s okay to still
                                    // use x afterward

} // Here, x goes out of scope, then s. But because s's value was moved, nothing
  // special happens.

fn takes_ownership(some_string: String) { // some_string comes into scope
    println!("{}", some_string);
} // Here, some_string goes out of scope and `drop` is called. The backing
  // memory is freed.

fn makes_copy(some_integer: i32) { // some_integer comes into scope
    println!("{}", some_integer);
} // Here, some_integer goes out of scope. Nothing special happens.
Shepmaster
  • 388,571
  • 95
  • 1,107
  • 1,366
joesan
  • 13,963
  • 27
  • 95
  • 232
  • If you are cross compiling - https://os.phil-opp.com/cross-compile-libcore/ – doublesharp May 31 '19 at 06:07
  • If you have a link to the examples you're following that might help as well – doublesharp May 31 '19 at 06:10
  • It is just a simple program to test out Ownership concepts! I have added the main.rs to my post above! Nothing special in that – joesan May 31 '19 at 06:12
  • rustup target add x86_64-unknown-linux-gnu also did not help° – joesan May 31 '19 at 06:13
  • The example you are using is not for the PC, but for an embedded device. For running simple programs on the PC you should better start anew with something like `cargo new my-example`. – starblue May 31 '19 at 06:46
  • It's hard to answer your question because it doesn't include a [MCVE]. We can't tell **how** you are attempting to compile the code. It would make it easier for us to help you if you try to reproduce your error on the [Rust Playground](https://play.rust-lang.org) if possible, otherwise in a brand new Cargo project, then [edit] your question to include the additional info. There are [Rust-specific MCVE tips](//stackoverflow.com/tags/rust/info) you can use to reduce your original code for posting here. Thanks! – Shepmaster May 31 '19 at 14:21
  • I had the same error because my shell was defaulting to system-wide cargo installation in `/usr/local/bin/cargo` instead of one provided by rustup. – Mikko Ohtamaa Sep 29 '20 at 15:13

3 Answers3

4

Your code works fine on the Rust playground, so I recommend checking your Rust installation and environment settings.


You may want to use the preconfigured Rust Docker image to run your app. Have Docker installed, then:

docker pull rust

Go to your project folder and run:

docker run --rm --user "$(id -u)":"$(id -g)" -v "$PWD":/usr/src/myapp -w /usr/src/myapp rust cargo run

Output:

hello
5

For your simple example on a PC, you don't need any of these dependencies:

[dependencies]
dwm1001 = "0.1.0"
panic-halt = "0.2.0"
nb = "0.1.1"

Here are my steps to test your sample on Linux:

cargo new hello
cd hello
code .

Open main.rs and paste your sample main.rs and save:

fn main() {
    let s = String::from("hello"); // s comes into scope

    takes_ownership(s); // s's value moves into the function...
                        // ... and so is no longer valid here

    let x = 5; // x comes into scope

    makes_copy(x); // x would move into the function,
                   // but i32 is Copy, so it’s okay to still
                   // use x afterward
} // Here, x goes out of scope, then s. But because s's value was moved, nothing
  // special happens.

fn takes_ownership(some_string: String) {
    // some_string comes into scope
    println!("{}", some_string);
} // Here, some_string goes out of scope and `drop` is called. The backing
  // memory is freed.

fn makes_copy(some_integer: i32) {
    // some_integer comes into scope
    println!("{}", some_integer);
} // Here, some_integer goes out of scope. Nothing special happens.

In a terminal inside the hello folder, run:

cargo run

And the output is good:

hello
5

This may help:

  1. Shell command

    rustup component list --installed
    

    Output:

    cargo-x86_64-unknown-linux-gnu
    clippy-x86_64-unknown-linux-gnu
    rls-x86_64-unknown-linux-gnu
    rust-analysis-x86_64-unknown-linux-gnu
    rust-docs-x86_64-unknown-linux-gnu
    rust-src
    rust-std-x86_64-unknown-linux-gnu
    rustc-x86_64-unknown-linux-gnu
    rustfmt-x86_64-unknown-linux-gnu
    
  2. Shell command:

    rustup show
    

    Output:

    Default host: x86_64-unknown-linux-gnu
    
    installed toolchains
    --------------------
    
    stable-x86_64-unknown-linux-gnu (default)
    nightly-x86_64-unknown-linux-gnu
    
    active toolchain
    ----------------
    
    stable-x86_64-unknown-linux-gnu (default)
    rustc 1.35.0 (3c235d560 2019-05-20)
    
Shepmaster
  • 388,571
  • 95
  • 1,107
  • 1,366
wasmup
  • 14,541
  • 6
  • 42
  • 58
  • The reason why I have those dependencies is to do something else, but since I'm starting out with Rust, I wanted to test ownership concepts first! So I do need those dependencies! – joesan May 31 '19 at 07:23
  • OK, with these extra dependencies present, the `cargo run` still runs OK, but takes more time. – wasmup May 31 '19 at 07:28
  • May be clean install of rust may solve the problem. (It seems) – wasmup May 31 '19 at 07:33
  • rustup self uninstall - Will try this and then do a fresh install to see if it works! – joesan May 31 '19 at 07:35
  • Your code also works fine (press Run) on the rust [playground](https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=07be7e9340160058a288485f2a690c83). – wasmup May 31 '19 at 07:44
  • How can I change the default host for this specific project? Right now, my default host is: x86_64-apple-darwin which I guess is why I get this error – joesan May 31 '19 at 08:34
  • Use `rustup target help` to get help. and use `rustup target list` to get list of installed and available targets, use `rustup toolchain help` and `rustup toolchain list`. see [here](https://github.com/rust-lang/rustup.rs). – wasmup May 31 '19 at 08:47
  • I still have this issue on Linux – chovy Apr 29 '22 at 11:53
  • @chovy: check [this](https://github.com/rust-lang/rust/blob/master/compiler/rustc_error_codes/src/error_codes/E0463.md) and [this](https://stackoverflow.com/questions/67898431/errore0463-cant-find-crate-for-core-while-building-rust-project-for-wasm32) – wasmup Apr 29 '22 at 13:14
  • 2nd link i already tried. I get this error: ` = note: /usr/bin/ld:/tmp/rustcPJoEQl/list:6: syntax error in VERSION script collect2: error: ld returned 1 exit status` – chovy Apr 29 '22 at 13:31
  • @chovy see [this](https://stackoverflow.com/questions/35530964/compiling-error-syntax-error-in-version-script). Is your code working in [the Rust playground](https://play.rust-lang.org/)? – wasmup Apr 29 '22 at 13:48
  • I don’t really know anything about rust. Just trying to get a dfinity canister working. – chovy Apr 29 '22 at 17:22
  • @chovy: How about [this](https://smartcontracts.org/docs/rust-guide/rust-quickstart.html)? – wasmup Apr 29 '22 at 17:58
1

I solved this in my case with:

rustup target add wasm32-unknown-unknown
Nae
  • 14,209
  • 7
  • 52
  • 79
0

When you first install a toolchain, rustup installs only the standard library for your host platform - that is, the architecture and operating system you are presently running. To compile to other platforms you must install other target platforms. This is done with the rustup target add command. For example, to add the Android target:

See The Rustup Book - Cross-compilation

For example:

$ rustup target add aarch64-unknown-linux-gnu
info: downloading component 'rust-std' for 'aarch64-unknown-linux-gnu'
info: installing component 'rust-std' for 'aarch64-unknown-linux-gnu'

To get the target string on the target machine, if rust is installed, you can run:

rustc -vV

e.g. output

rustc 1.67.1 (d5a82bbd2 2023-02-07)
binary: rustc
commit-hash: d5a82bbd26e1ad8b7401f6a718a9c57c96905483
commit-date: 2023-02-07
host: aarch64-unknown-linux-gnu
release: 1.67.1
LLVM version: 15.0.6

The host field can be used as the argument to rustup target add

Note: You may run into linker issues, in which case you can configure your linker, see Cargo Book - Configuration - Target

JBaczuk
  • 13,886
  • 10
  • 58
  • 86