Rust引入含子模块的外部源文件报错,如何解决?
Rust路径引入模块时子模块查找路径问题的解决方法
问题场景
项目初始结构:
gen/foo.rs gen/foo/bar.rs src/main.rs
gen/foo.rs内容:
mod bar;
gen/foo/bar.rs为空文件。src/main.rs内容:
#[path = "../gen/foo.rs"] mod foo; fn main() { println!("Hello, world!"); }
运行后触发报错:
error[E0583]: file not found for module `bar` --> src/../gen/foo.rs:1:1 | 1 | mod bar; | ^^^^^^^^ | = help: to create the module `bar`, create file "src/../gen/bar.rs" or "src/../gen/bar/mod.rs"
若将所有模块文件放在src目录下(结构如下),代码可正常运行:
src/foo.rs src/foo/bar.rs src/main.rs
但通过#[path]引入gen/foo.rs时,Rust会在gen/目录而非gen/foo/目录下查找其子模块bar,现需在不修改gen目录下文件的前提下解决该问题。
解决方法
只需调整src/main.rs的模块引入逻辑,通过创建一个逻辑上的gen模块,即可修正子模块的查找路径:
修改后的src/main.rs代码:
// 定义逻辑上的gen模块,关联实际的gen目录 mod gen { // 在gen模块内部引入foo.rs,路径相对于实际的gen目录 #[path = "foo.rs"] pub mod foo; } // 正常使用gen::foo模块 use gen::foo; fn main() { println!("Hello, world!"); }
原理说明
直接使用#[path = "../gen/foo.rs"] mod foo;时,Rust会将foo模块的逻辑父目录认定为src/(即main.rs的所在目录),因此查找子模块bar时会指向src/../gen/bar.rs(也就是gen/bar.rs)。
而通过在main.rs中定义逻辑上的gen模块,相当于把实际的gen目录作为该顶级模块的根目录,此时foo模块的逻辑父目录对应实际的gen/目录,子模块bar就会按照正常的目录结构去gen/foo/bar.rs查找,行为与src目录下的模块完全一致。
内容的提问来源于stack exchange,提问作者Conrado
相关产品推荐
相关产品推荐

