在机箱根目录中找不到[包]



如何让铁锈识别机箱中的模块?我认为在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]

您混淆了板条箱和包装。根据书中的相应章节:

板条箱是Rust编译器一次考虑的最小代码量。[…]板条箱可以有两种形式之一:二进制板条箱或库板条箱。

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

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

  • https://github.com/sharkdp/bat/blob/2dbc88d3afdacf6449f299c70f29e5456904779b/src/bin/bat/main.rs
编译二进制文件时,它被视为项目结构的根。因此,lib.rs不是为二进制目标编译的,除非您也将其添加到二进制中,否则您不能使用它的任何模块。最常见的方法是将二进制文件与lib.rs一起放在src文件夹中,这样在使用模块时就不必担心文件夹结构了。我想你可以在二进制文件的顶部使用include!("lib.rs");,使它继承库中的所有内容,但我没有尝试过,它可能被认为是糟糕的形式。

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

还有一些方法可以绕过这一点,就是让板条箱成为自己的依赖,但这些解决方案总是让我对解决方案的稳定性感到有点不安。这个答案可以让你大致了解它的样子。

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

  • https://github.com/stanislav-tkach/os_info(工作区成员(
  • https://github.com/sagiegurari/cargo-make(Binaires来源(
  • https://github.com/hominee/dyer(子费率(dyer-macros((
  • https://github.com/clap-rs/clap(二进制文件示例(

最新更新