Rust项目中lib.rs无法导入同目录app.rs模块如何解决
Rust 同目录下lib.rs导入app.rs模块报错解决方案
问题根源
- Rust 项目中
src/main.rs是二进制 crate 的根,src/lib.rs是库 crate 的根,两者属于完全独立的模块树,不存在从属关系 - 在
lib.rs中直接写mod app;时,Rust 会默认去src/lib/目录下查找对应模块文件,因此会抛出找不到文件的报错 - 你之前在
main.rs中写mod lib;属于错误用法,相当于把lib.rs当成了二进制 crate 下的普通子模块,没有用到库 crate 的能力,正确的库内容引用方式是直接通过包名导入,比如你的包名为my_project就写use my_project::xxx;
解决方案
方案1:将app.rs作为库crate的模块(推荐)
如果 app.rs 属于通用公共逻辑,优先归到库侧管理:
- 在
src/目录下新建lib文件夹,将app.rs移动到src/lib/app.rs - 在
src/lib.rs中添加模块声明:pub mod app;,可按需写pub use app::*;直接导出app内的公开方法 - 删除
main.rs中原有的mod lib;、mod app;声明,所有对库、app模块的引用都通过包名导入,比如你的Cargo.toml中name = "my_project",就写:
// main.rs 中导入app的公开方法 use my_project::app::your_public_function;
方案2:app.rs作为二进制crate的模块,公共逻辑抽离到库
如果 app.rs 是仅二进制侧使用的业务逻辑,不要在 lib.rs 中导入它:
- 把需要在库侧调用的公共逻辑抽离出来放到库的模块中,二进制侧和app.rs统一从库侧导入公共能力,不要反过来让库依赖二进制的模块
- 仅在
src/main.rs中添加mod app;声明,即可正常使用app内的方法
补充:不推荐的临时解决方案
如果你一定要把app.rs放在src/根目录同时给lib.rs导入,可以在lib.rs里手动指定模块路径:
#[path = "./app.rs"] mod app;
但这种写法会破坏Rust模块树和目录的默认映射规则,后期维护成本高,不推荐长期使用。
内容的提问来源于stack exchange,提问作者Cholewka
相关产品推荐
相关产品推荐

