如何让铁锈识别机箱中的模块?我认为在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.rs
和bin/b.rs
文件定义了两个独立的板条箱,因此crate
指的是不同的东西。两者都属于相同的程序包,该程序包由Cargo.toml
文件定义。要在二进制机箱中使用库机箱中的函数,请使用机箱名称而不是crate
。在您的情况下,板条箱名称与包裹名称相同,即m
。请注意,您必须将您的库项目标记为pub
才能在另一个板条箱中使用它们。
这方面的一个例子可以在bat
程序中找到,该程序在bat
二进制机箱的导入中同时使用crate
和bat
:
- 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(二进制文件示例(