Rust多文件编译失败求助:如何优雅拆分代码?
Rust多文件项目编译错误修复与代码优雅拆分方案
修复file not found for module strutils错误
你遇到的编译错误是因为Rust无法识别strutils模块的结构,针对你的项目布局,有两种直接的修复方式:
方式1:使用mod.rs(传统模块组织方式)
在src/strutils/目录下创建mod.rs文件,内容如下:
// src/strutils/mod.rs // 声明并导出get_wide_str子模块 pub mod get_wide_str;
修改main.rs,引入需要使用的函数:
// src/main.rs use windows::core::*; // 声明strutils模块 mod strutils; // 引入子模块中的函数 use strutils::get_wide_str::{get_wide_str, get_wide_ptr}; fn main() -> Result<()> { // 示例调用 let test_str = "hello"; let wide_str = get_wide_str(test_str); Ok(()) }
方式2:直接在父模块声明子模块(Rust 2018+推荐)
无需创建mod.rs,直接在main.rs中声明模块结构:
// src/main.rs use windows::core::*; // 直接声明strutils模块及其子模块,对应目录下的get_wide_str.rs文件 mod strutils { pub mod get_wide_str; } // 引入函数 use strutils::get_wide_str::{get_wide_str, get_wide_ptr}; fn main() -> Result<()> { Ok(()) }
如果不需要strutils作为中间模块,也可以直接声明子模块:
// src/main.rs use windows::core::*; // 直接对应src/strutils/get_wide_str.rs文件 mod strutils::get_wide_str; use strutils::get_wide_str::{get_wide_str, get_wide_ptr}; fn main() -> Result<()> { Ok(()) }
优雅拆分Rust代码的实践
- 按功能聚类:将同一领域的代码放在同一模块下,比如字符串处理相关的函数都归到
strutils模块,后续可扩展trim.rs、decode.rs等子模块。 - 严格控制可见性:仅用
pub关键字对外暴露必要的函数、结构体或枚举,内部实现细节保持私有,避免接口冗余。 - 简化模块声明:Rust 2018及以后版本,优先使用“目录+文件”的直接映射方式,无需冗余的
mod.rs,除非模块内部有需要共享的公共逻辑(比如子模块之间共享的工具函数)。
你的代码中的潜在问题
get_wide_ptr函数存在指针悬空风险:
pub fn get_wide_ptr(src: Vec<u16>) -> LPCWSTR { src.as_ptr() }
当Vec<u16>传入函数后,所有权被转移到函数内部,函数执行结束时Vec会被销毁,对应的内存被释放,返回的指针会变成无效指针,后续使用会引发未定义行为。
修复方案:改为接收引用而非转移所有权:
// 接收Vec引用 pub fn get_wide_ptr(src: &Vec<u16>) -> LPCWSTR { src.as_ptr() } // 更灵活的切片引用方式(推荐) pub fn get_wide_ptr(src: &[u16]) -> LPCWSTR { src.as_ptr() }
这样只要原Vec的生命周期足够长,返回的指针就始终有效。
内容的提问来源于stack exchange,提问作者Nayrosk
相关产品推荐
相关产品推荐

