web-dev-qa-db-fra.com

Rust ne peut pas trouver la caisse

J'essaie de créer un module dans Rust puis de l'utiliser à partir d'un fichier différent. Voici ma structure de fichier:

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

Voici Cargo.toml:

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

[dependencies]

C'est main.rs:

extern crate plot;

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

C'est lib.rs:

mod plot;

c'est intrigue/mod.rs

mod line;

et ceci est plot/line.rs

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

Lorsque j'essaie de compiler mon programme en utilisant: cargo run Je reçois:

   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;

Comment compiler mon programme? Pour autant que je sache à partir des documentations en ligne, cela devrait fonctionner, mais ce n'est pas le cas.

19
Stein

Vous rencontrez les problèmes suivants:

  1. vous devez utiliser extern crate bitter_oyster; dans main.rs, parce que le binaire produit utilise votre caisse, le binaire ne fait pas partie de celui-ci.

  2. Appelez également bitter_oyster::plot::line::test(); dans main.rs Au lieu de plot::line::test();. plot est un module de la caisse bitter_oyster, tel que line. Vous faites référence à la fonction test avec son nom complet.

  3. Assurez-vous que chaque module est exporté sous le nom complet. Vous pouvez rendre un module public avec le mot clé pub, comme pub mod plot;

Vous pouvez trouver plus d'informations sur le système de modules de Rust ici: https://doc.Rust-lang.org/book/crates-and-modules.html

Une copie de travail de la structure de votre module est la suivante:

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");
}
17
Tibor Benke

Si vous voyez cette erreur:

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

il se peut que vous n'ayez pas ajouté la caisse souhaitée à la liste des dépendances dans votre Cargo.toml:

[dependencies]
PACKAGE = "1.2.3"

Voir spécification des dépendances dans les documents Cargo .

13
Andy Hayden

Pour ajouter aux réponses données, une bibliothèque compilée comme cdylib ( docs ) peut générer cette erreur lorsque vous essayez de la référencer dans un autre projet. Je l'ai résolu en séparant le code que je souhaitais réutiliser dans un projet lib normal.

8
Sebastiaan