[英]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 成为自身的依赖项,但是这些解决方案总是让我对解决方案的稳定性感到有些不安。 这个答案可以让您大致了解它的外观。
以下是各种解决方案的一些示例。 如果您想知道,这些只是我发现的第一个符合设计模式的板条箱。 我不知道其中一些做什么/包含什么。
dyer-macros
))您正在混淆板条箱和包裹。 根据书中的相应章节:
crate 是 Rust 编译器一次考虑的最小代码量。 [...] crate 可以来自两个 forms 之一:二进制 crate 或 library crate。
这意味着您的lib.rs
和bin/b.rs
文件定义了两个单独的 crate,因此crate
指的是不同的东西。 两者都属于同一个package ,它由您的Cargo.toml
文件定义。 要在二进制 crate 中使用库 crate 中的函数,请使用 crate 名称而不是crate
。 在您的情况下,板条箱名称与 package 名称相同,即m
。 请注意,您必须将库项目标记为pub
才能在另一个 crate 中使用它们。
这方面的一个例子可以在bat
程序中找到,它在bat
二进制 crate 的导入中同时使用crate
和bat
:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.