我有一个依赖于本地库的二进制箱
我正在尝试从二进制板条箱的 main.rs 调用 paralang::hello_world 。
库 Cargo.toml
[package]
name = "paralang"
version = "0.1.0"
edition = "2021"
[lib]
crate-type = ["cdylib"]
二进制 Cargo.toml
[package]
name = "paralang-language-server"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
serde_json = "1.0.78"
tokio = { version = "1.17.0", features = ["full"] }
tower-lsp = { version = "0.20.0", features = ["proposed"]}
dashmap = "5.5.3"
paralang = { version = "0.1.0", path = "../paralang" }
文件系统如下所示:
D:\Repos\paralang (library crate)
D:\Repos\paralang-language-server (binary crate)
我用
cargo add --path "../paralang"
添加了本地依赖
编译器设法解析 hello_world 函数,但抱怨“paralang”模块。
运行货物构建时出现此错误:
error[E0432]: unresolved import `paralang`
--> src\main.rs:5:5
|
5 | use paralang::hello_world;
| ^^^^^^^^ use of undeclared crate or module `paralang`
For more information about this error, try `rustc --explain E0432`.
其他背景:
rustc 1.70.0 (90c541806 2023-05-31)
cargo 1.70.0 (ec8a8a0ca 2023-04-25)
我做错了什么?
这里的问题不是
paralang
板条箱是本地的,而是只有类型 cdylib
的板条箱不会生成可以使用 extern crate cratename;
或 cargo
魔法导入的 Rust 库,仅 1:
,--crate-type=cdylib
- 将生成一个动态系统库。这在编译要从另一种语言加载的动态库时使用。此输出类型将在 Linux 上创建#![crate_type = "cdylib"]
文件、在 macOS 上创建*.so
文件以及在 Windows 上创建*.dylib
文件。*.dll
要支持 C-FFI 动态库 和 (包括其他 Rust 箱),只需将
cdylib
和 lib
添加到您的 crate-type
:
[lib]
crate-type = ["cdylib", "lib"]
这会导致:
,--crate-type=lib
- 将生成一个 Rust 库。对于到底生成什么是一个模糊的概念,因为库可以以多种形式表现出来。此通用 lib 选项的目的是生成“编译器推荐”样式的库。输出库始终可供 rustc 使用,但库的实际类型可能会不时发生变化。其余的输出类型都是不同风格的库,lib 类型可以看作其中之一的别名(但实际的类型是编译器定义的)。#![crate_type = "lib"]
此外。
1:来自 Linkage – Rust 参考