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

Rust工作空间跨目录引用问题:如何从main.rs引用其他crate结构体

如何在Rust工作空间中跨目录引用模块

看起来你在Rust工作空间的跨crate引用上遇到了几个小问题,我来一步步帮你解决:

1. 修正First crate的文件结构与模块导出

你当前的First目录结构里,Cool_thing.rs是和src文件夹同级的,但Rust只会编译src目录下的文件,所以第一步要把Cool_thing.rs移到First/src目录下,让它成为库crate的一部分。

接下来,First作为库crate(只有库crate才能被其他crate引用),需要在First/src/lib.rs中把Cool_thing模块公开导出,这样其他crate才能访问它:

// First/src/lib.rs
pub mod Cool_thing;

如果你的First之前是二进制crate,记得确认它的First/Cargo.toml里包含库类型配置(新建库crate时会自动生成,若没有则手动添加):

# First/Cargo.toml
[lib]
crate-type = ["lib"]

2. 清理工作空间的无效配置

你在Primary/Cargo.toml里添加的[dependencies.Second]块是多余的,工作空间的Cargo.toml只需要声明成员即可,每个成员的依赖由各自的Cargo.toml管理。所以把这部分删掉,只保留:

# Primary/Cargo.toml
[workspace]
members = ["First", "Second", "Third"]

3. 正确引用First中的结构体

你的Second/Cargo.toml里的依赖配置是正确的:

# Second/Cargo.toml
[dependencies]
First = { path = "../First" }

在Rust 2018及以后的版本中,extern crate已经不再需要了,直接在Second/src/main.rs中使用use语句引用即可。注意模块和结构体的名字要和实际代码一致(比如你的模块是Cool_thing,结构体是Cool_things):

// Second/src/main.rs
use First::Cool_thing::Cool_things;

fn main() {
    // 这里可以实例化或使用Cool_things结构体
    let my_cool_thing = Cool_things; // 或者比如 Cool_things::new(),根据你的实现调整
}

为什么之前的方法不生效?

  • 你的Cool_thing.rs不在First的src目录下,Rust编译器根本不会编译这个文件,自然无法找到对应的模块。
  • 即使文件位置正确,没有在lib.rs中用pub mod导出模块,其他crate也无法访问这个模块的内容。
  • 工作空间的Cargo.toml不需要为成员配置依赖,这会导致不必要的配置冲突。

内容的提问来源于stack exchange,提问作者Rick Dearman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 17:27:42