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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 05:45:34