Rustでモジュールを作成し、別のファイルから使用しようとしています。これは私のファイル構造です。
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
これはCargo.tomlです:
[package]
name = "bitter-oyster"
version = "0.1.0"
authors = ["matthias"]
[dependencies]
これはmain.rsです:
extern crate plot;
fn main() {
println!("----");
plot::line::test();
}
これはlib.rsです。
mod plot;
これはplot/mod.rsです
mod line;
これはplot/line.rsです
pub fn test(){
println!("Here line");
}
次を使用してプログラムをコンパイルしようとすると、cargo run
私は得る:
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;
プログラムをコンパイルするにはどうすればよいですか?オンラインのドキュメントからわかる限り、これは機能するはずですが、機能しません。
次の問題があります。
_extern crate bitter_oyster;
_を_main.rs
_で使用する必要があります。生成されたバイナリはクレートを使用するため、バイナリはその一部ではない。
また、bitter_oyster::plot::line::test();
の代わりに_main.rs
_でplot::line::test();
を呼び出します。 plot
は、line
などの_bitter_oyster
_クレートのモジュールです。 test
関数を完全修飾名で参照しています。
すべてのモジュールが完全修飾名でエクスポートされていることを確認してください。 _pub mod plot;
_のようなpub
キーワードを使用してモジュールを公開できます
Rustのモジュールシステムの詳細については、こちらをご覧ください。 https://doc.Rust-lang.org/book/crates-and-modules.html
モジュール構造の作業コピーは次のとおりです。
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");
}
_
このエラーが表示される場合:
error[E0463]: can't find crate for `PACKAGE`
|
1 | extern crate PACKAGE;
| ^^^^^^^^^^^^^^^^^^^^^ can't find crate
Cargo.toml
の依存関係リストに目的のクレートを追加していない可能性があります。
[dependencies]
PACKAGE = "1.2.3"
貨物ドキュメントで依存関係を指定する 。を参照
与えられた答えに追加するために、cdylib
( docs )としてコンパイルされたライブラリは、別のプロジェクトで参照しようとしたときにこのエラーを生成できます。通常のlib
プロジェクトで再利用したいコードを分離することで解決しました。