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
相关产品推荐
相关产品推荐

