如何将Rust项目链接子文件夹中的rlib库并调用其函数?
解决Rust项目中外部库依赖与函数调用的问题
刚从C++转Rust碰到这种库依赖的问题很正常,我帮你一步步理清楚问题所在并解决:
一、核心问题拆解
你现在的问题主要出在两个地方:
- 主项目里错误用
mod utils;声明本地模块,但你实际是通过Cargo.toml引入了外部crate,完全不需要这个声明 - utils库的代码里误用了条件编译属性,而且要被外部调用的函数没有导出(没加
pub)
二、分步修正方案
1. 修正主项目的main.rs
直接删掉mod utils;这一行,因为你已经在Cargo.toml里配置了utils crate的依赖,直接通过utils::调用即可。修改后的代码:
fn main() { println!("Hello, world!"); utils::test123(); // 现在能正确调用 }
2. 修正utils库的lib.rs
你的原代码里#[cfg(utils)]和#[utils]都是无效的属性,而且test123函数没有对外导出,外部crate根本看不到它。修改后的代码:
// 用pub标记函数,让外部crate可以访问 pub fn test123() { println!("test!"); } // 测试模块保持原来的#[cfg(test)]即可,这是Rust标准的测试条件编译 #[cfg(test)] mod tests { // 注意:原测试函数写法有误,#[test]标记的函数不能有返回值,也不能直接写泛型加法(需要约束) // 这里改成一个简单的测试示例 #[test] fn adder() { assert_eq!(2 + 3, 5); // 断言加法结果正确 } }
三、关键概念解释(帮你理清Rust的模块和条件编译)
1. 外部Crate vs 本地模块
mod utils;:这是用来声明当前crate内部的本地模块,对应的是你主项目src目录下的utils.rs或utils/mod.rs文件,和你单独创建的utils库完全是两回事- Cargo.toml依赖:你添加的
utils = { path = "utils" }是引入一个独立的外部crate,此时不需要mod声明,直接用utils::调用它导出的内容即可
2. #[cfg...]条件编译属性
#[cfg(...)]是Rust的条件编译标记,用来指定代码块在什么场景下才会被编译:
#[cfg(test)]:只有当你运行cargo test时,这个代码块才会被编译执行(比如测试模块)- 常见的还有
#[cfg(target_os = "windows")](仅Windows下编译)、#[cfg(feature = "xxx")](仅当开启xxx特性时编译) - 你写的
#[cfg(utils)]是无效的,因为没有这个内置条件,自定义条件需要在Cargo.toml的[features]里配置
四、验证步骤
- 先确认你的目录结构是正确的:
rust_test/ ├── Cargo.toml ├── src/ │ └── main.rs └── utils/ ├── Cargo.toml └── src/ └── lib.rs
- 在rust_test根目录运行
cargo run,应该会输出:
Hello, world! test!
- 运行
cargo test,测试模块会正常执行并通过。
内容的提问来源于stack exchange,提问作者code_fodder
相关产品推荐
相关产品推荐

