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

如何将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]里配置

四、验证步骤

  1. 先确认你的目录结构是正确的:
rust_test/
├── Cargo.toml
├── src/
│   └── main.rs
└── utils/
    ├── Cargo.toml
    └── src/
        └── lib.rs
  1. 在rust_test根目录运行cargo run,应该会输出:
Hello, world!
test!
  1. 运行cargo test,测试模块会正常执行并通过。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 00:02:57