Rust can't find crate

2020-02-27 07:47发布

问题:

I'm trying to create a module in Rust and then use it from a different file. This is my file structure:

matthias@X1:~/projects/bitter-oyster$ tree
.
├── Cargo.lock
├── Cargo.toml
├── Readme.md
├── src
│   ├── liblib.rlib
│   ├── lib.rs
│   ├── main.rs
│   ├── main.rs~
│   └── plot
│       ├── line.rs
│       └── mod.rs
└── target
    └── debug
        ├── bitter_oyster.d
        ├── build
        ├── deps
        ├── examples
        ├── libbitter_oyster.rlib
        └── native

8 directories, 11 files

This is Cargo.toml:

[package]
name = "bitter-oyster"
version = "0.1.0"
authors = ["matthias"]

[dependencies]

This is main.rs:

extern crate plot;

fn main() {
    println!("----");
    plot::line::test();
}

This is lib.rs:

mod plot;

this is plot/mod.rs

mod line;

and this is plot/line.rs

pub fn test(){
    println!("Here line");
}

When I try to compile my program using: cargo run I get:

   Compiling bitter-oyster v0.1.0 (file:///home/matthias/projects/bitter-oyster)
/home/matthias/projects/bitter-oyster/src/main.rs:1:1: 1:19 error: can't find crate for `plot` [E0463]
/home/matthias/projects/bitter-oyster/src/main.rs:1 extern crate plot;

How do I compile my program? As far as I can tell from online documentations this should work, but it doesn't.

回答1:

You have the following problems:

  1. you have to use extern crate bitter_oyster; in main.rs, because the produced binary uses your crate, the binary is not a part of it.

  2. Also, call bitter_oyster::plot::line::test(); in main.rs instead of plot::line::test();. plot is a module in the bitter_oyster crate, such as line. You are referring to the test function with its fully qualified name.

  3. Make sure, that every module is exported in the fully qualified name. You can make a module public with the pub keyword, like pub mod plot;

You can find more information about Rust's module system here: https://doc.rust-lang.org/book/crates-and-modules.html

A working copy of your module structure is as follows:

src/main.rs:

extern crate bitter_oyster;

fn main() {
    println!("----");
    bitter_oyster::plot::line::test();
}

src/lib.rs:

pub mod plot;

src/plot/mod.rs:

pub mod line;

src/plot/line.rs :

pub fn test(){
    println!("Here line");
}


回答2:

If you see this error:

error[E0463]: can't find crate for `PACKAGE`
  |
1 | extern crate PACKAGE;
  | ^^^^^^^^^^^^^^^^^^^^^ can't find crate

it could be that you haven't added the desired crate to the dependencies list in your Cargo.toml:

[dependencies]
PACKAGE = "1.2.3"

See specifying dependencies in the Cargo docs.



回答3:

To add to the given answers, a library compiled as a cdylib (docs) can generate this error when you try to reference it in another project. I solved it by separating the code I wished to reuse in a regular lib project.