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

我正在try 从二进制箱的main.ars调用paralang::Hello_world.

Library 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’模块.

enter image description here

enter image description here

运行Cargo Build时,我收到以下错误:

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#![crate_type = "cdylib"]-将生成一个动态系统库.这在编译要从另一种语言加载的动态库时使用.此输出类型将在Linux上创建*.so个文件,在MacOS上创建*.dylib个文件,在Windows上创建*.dll个文件.

要同时支持C-FFI动态库and(包括来自其他铁 rust 箱),只需将cdyliblib添加到您的crate-type:

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

这将导致:

--crate-type=lib,#![crate_type = "lib"]-将制作一个铁 rust 库.这是一个不明确的概念,因为库可以以几种形式表现出来.这个泛型库选项的目的是生成"编译器推荐"样式的库.输出库将始终可由rustc使用,但实际的库类型可能会随时间而变化.其余的输出类型都是不同风格的库,lib类型可以被视为其中之一的别名(但实际的别名是编译器定义的).

此外.

参见Dynamic linking between crates了解如何动态链接而不是静态链接lib.


1:从Linkage – The Rust Reference开始

Rust相关问答推荐

trait 中self 的显式生命周期似乎导致E0499无法在循环中多次borrow * emits 器作为可变的

如何对字符串引用的引用向量进行排序,而不是对最外层的引用进行排序?

关于Rust 中回归的逻辑

下载压缩文件

带扫描的铁 rust 使用滤镜

当第二个`let`依赖于第一个`let()`时,如何在一行中有多个`let()`?

制作一片连续整数的惯用Rust 方法?

"value is never read警告似乎不正确.我应该忽略它吗?

支持TLS的模拟HTTP服务器

你是如何在铁 rust 一侧的金牛座获得应用程序版本的?

借来的价值生命周期 不够长,不确定为什么它仍然是借来的

Rust Option 的空显式泛型参数

`use` 和 `crate` 关键字在 Rust 项目中效果不佳

为什么要这样编译?

具有在宏扩展中指定的生命周期的枚举变体数据类型

用逗号分隔字符串,但在标记中使用逗号

Abortable:悬而未决的期货?

如何创建动态创建值并向它们返回borrow 的工厂?

返回 &str 但不是 String 时,borrow 时间比预期长

为什么我返回的 impl Trait 的生命周期限制在其输入的生命周期内?