Rust嵌套工作区中无法导入其他包的问题排查
问题描述
项目结构
├── Cargo.lock ├── Cargo.toml ├── lib1 │ ├── Cargo.lock │ ├── Cargo.toml │ ├── pyproject.toml │ └── src │ └── lib.rs └── lib2 ├── Cargo.lock ├── Cargo.toml ├── pyproject.toml └── src └── lib.rs
相关文件内容
根目录Cargo.toml
[workspace] resolver = "2" members = ["lib1", "lib2"]
lib1/Cargo.toml
[package] name = "lib1" version = "0.1.0" edition = "2021" [lib] name = "lib1" crate-type = ["cdylib"] [dependencies] pyo3 = "0.22.0"
lib2/Cargo.toml
[package] name = "lib2" version = "0.1.0" edition = "2021" [lib] name = "lib2" crate-type = ["cdylib"] [dependencies] pyo3 = "0.22.0" lib1 = {path = "../lib1"}
操作与错误
在lib1/src/lib.rs中定义了函数sum_as_strings,想要在lib2/src/lib.rs中通过use lib1::sum_as_strings;导入使用。但从lib2目录运行maturin develop时,出现以下错误:
$ maturin develop 🔗 Found pyo3 bindings 🐍 Found CPython 3.11 at /home/ignoring_gravity/nested-pyo3-example/.venv/bin/python 📡 Using build options features from pyproject.toml Compiling lib2 v0.1.0 (/home/ignoring_gravity/nested-pyo3-example/lib2) error[E0432]: unresolved import `lib1` --> lib2/src/lib.rs:2:5 | 2 | use lib1::sum_as_strings; | ^^^^ use of undeclared crate or module `lib1` | help: there is a crate or module with a similar name | 2 | use lib2::sum_as_strings; | ~~~~
请问哪里操作有误或遗漏了什么?
解决方案
问题出在lib1的编译类型配置和函数可见性上:
- 修改lib1的crate-type:
cdylib仅用来编译供非Rust程序(比如Python)调用的动态库,无法被其他Rust crate直接依赖。要让lib1同时支持Python调用和Rust crate依赖,需要添加rlib类型(Rust标准库格式)。
修改lib1/Cargo.toml的[lib]部分:
[lib] name = "lib1" crate-type = ["cdylib", "rlib"] # 同时支持动态库和Rust库格式
- 确保lib1的函数公开可访问:
在lib1/src/lib.rs中,要被外部引用的函数必须加上pub关键字,示例:
pub fn sum_as_strings(a: &str, b: &str) -> String { // 函数实现逻辑 format!("{}", a.parse::<i32>().unwrap() + b.parse::<i32>().unwrap()) }
- 重新执行构建:
可以回到项目根目录运行maturin develop -m lib2/Cargo.toml,或者直接在lib2目录下重新执行maturin develop,此时依赖就能正常解析。
内容的提问来源于stack exchange,提问作者ignoring_gravity
相关产品推荐
相关产品推荐

