Rust crate无法识别模块怎么办?已在lib.rs声明mod仍报错
问题原因
你遇到的问题核心是:Cargo项目里,src/lib.rs定义的是独立的库crate,而src/bin/b.rs是另一个独立的二进制crate,二者是完全分开的编译单元,二进制crate的crate::关键字指向的是自己的根模块,而非库crate的根,所以找不到a模块。
两种解决方案
方案一:让二进制crate依赖库crate(推荐)
这是Cargo项目复用共享代码的标准方式:
- 修改
Cargo.toml,给二进制crate添加对当前库crate的依赖:
[[bin]] name = "b" path = "src/bin/b.rs" # 新增这一行,依赖当前项目的库crate(名称就是package里的name字段"m") dependencies.m = { path = "." }
- 修改
src/bin/b.rs,通过库名导入模块:
use m::a::f; fn main() {}
方案二:在二进制crate中直接导入模块
如果不想用库crate,也可以直接在二进制文件里导入a.rs,但需要指定文件路径:
// src/bin/b.rs // 用path属性指定a.rs的位置 #[path = "../a.rs"] mod a; use a::f; fn main() {}
这种方式不推荐,因为会导致a.rs的代码被编译两次(库crate和二进制crate各编译一次),浪费编译资源,也不利于代码统一维护。
额外说明
- 库crate(
lib.rs)是项目的共享代码中心,所有二进制crate都可以通过依赖它来复用代码。 - 每个
src/bin/下的rs文件都是独立的二进制程序,它们拥有自己的模块树,crate::只指向自己的模块根。
内容的提问来源于stack exchange,提问作者Test
相关产品推荐
相关产品推荐

