You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 12:35:42