导入 `cdylib` 库失败

问题描述 投票:0回答:1

我有一个依赖于本地库的二进制箱

我正在尝试从二进制板条箱的 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)

我做错了什么?

rust rust-cargo
1个回答
0
投票

这里的问题不是

paralang
板条箱是本地的,而是只有类型
cdylib
的板条箱不会生成可以使用
extern crate cratename;
cargo
魔法导入的 Rust 库,仅 1

--crate-type=cdylib
,
#![crate_type = "cdylib"]
- 将生成一个动态系统库。这在编译要从另一种语言加载的动态库时使用。此输出类型将在 Linux 上创建
*.so
文件、在 macOS 上创建
*.dylib
文件以及在 Windows 上创建
*.dll
文件。

要支持 C-FFI 动态库 (包括其他 Rust 箱),只需将

cdylib
lib
添加到您的
crate-type
:

[lib]
crate-type = ["cdylib", "lib"]

这会导致:

--crate-type=lib
,
#![crate_type = "lib"]
- 将生成一个 Rust 库。对于到底生成什么是一个模糊的概念,因为库可以以多种形式表现出来。此通用 lib 选项的目的是生成“编译器推荐”样式的库。输出库始终可供 rustc 使用,但库的实际类型可能会不时发生变化。其余的输出类型都是不同风格的库,lib 类型可以看作其中之一的别名(但实际的类型是编译器定义的)。

此外。


1:来自 Linkage – Rust 参考

© www.soinside.com 2019 - 2024. All rights reserved.