繁体   English   中英

Rust:在 crate 根目录中找不到 [package]

[英]Rust: Cannot find [package] in the crate root

如何让 rust 识别板条箱中的模块? 我相信在lib.rs中声明mod [module name]就足够了。 不是吗?

错误:

error[E0432]: unresolved import `crate::a`
 --> src/bin/b.rs:2:12
  |
2 | use crate::a::f;
  |            ^ could not find `a` in the crate root

src/a.rs

pub fn f() {}

src/bin/b.rs

use crate::a::f;

fn main() {}

src/lib.rs

mod a;

Cargo.toml

[package]
name = "m"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[[bin]]
name = "b"
path = "src/bin/b.rs"

[dependencies]

编译二进制文件时,它被视为项目结构的根。 所以lib.rs不是为二进制目标编译的,你不能使用它的任何模块,除非你也将它们添加到你的二进制文件中。 最常见的方法是将二进制文件与lib.rs一起放在src文件夹中,这样您在使用模块时无需担心文件夹结构。 我想你可以使用include.("lib;rs"); 在您的二进制文件的顶部,使其继承您库中的所有内容,但我没有尝试过它,它可能被认为是错误的形式。

但是,您可以通过使二进制文件依赖于您的库来回避这个问题。 最简单的方法是让你的二进制文件成为它自己的 crate,这取决于你的库。

也有一些方法可以解决这个问题,就是让 crate 成为自身的依赖项,但是这些解决方案总是让我对解决方案的稳定性感到有些不安。 这个答案可以让您大致了解它的外观。

以下是各种解决方案的一些示例。 如果您想知道,这些只是我发现的第一个符合设计模式的板条箱。 我不知道其中一些做什么/包含什么。

您正在混淆板条箱和包裹。 根据书中的相应章节

crate 是 Rust 编译器一次考虑的最小代码量。 [...] crate 可以来自两个 forms 之一:二进制 crate 或 library crate。

这意味着您的lib.rsbin/b.rs文件定义了两个单独的 crate,因此crate指的是不同的东西。 两者都属于同一个package ,它由您的Cargo.toml文件定义。 要在二进制 crate 中使用库 crate 中的函数,请使用 crate 名称而不是crate 在您的情况下,板条箱名称与 package 名称相同,即m 请注意,您必须将库项目标记为pub才能在另一个 crate 中使用它们。

这方面的一个例子可以在bat程序中找到,它在bat二进制 crate 的导入中同时使用cratebat

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM