Rust依赖冲突咨询:actix-web与sled的zstd-sys版本冲突如何解决?
问题背景
项目引入actix-web和sled两个依赖,actix-web依赖zstd-sys v2.0.4,sled启用compression特性后依赖zstd-sys 1.6.1。尝试让两个依赖分别链接对应版本的zstd时,运行cargo run出现以下错误:
Only one package in the dependency graph may specify the same links value. This helps ensure that only one copy of a native library is linked in the final binary. Try to adjust your dependencies so that only one package uses the links ='zstd-sys' value.
项目的Cargo.toml配置如下:
[dependencies] actix = "0.13.0" actix-web = { version = "4", features = ["rustls"] } actix-web-actors = "4.1.0" awc = { version = "3", features = ["rustls"] } tokio = { version = "1.23.1", features = ["sync"] } url = { version = "2.2", features = ["serde"] } env_logger = "0.10.0" sled = { version = "0.34.7", features = ["compression"], links = "zstd-sys=1.6.1"} bincode = "1.3.3" serde = {version = "1.0", features = ["derive"]} futures-util = "0.3.25" actix-codec = "0.5.0" rustls = "0.20.8" concurrent-map = "5.0.6" lazy_static = "1.4.0" [dependencies.xxhash-rust] version = "0.8.5" features = ["xxh3", "const_xxh3"]
解决方案
Cargo的links机制核心是保证同一原生库仅被链接一次,因此无法实现两个不同版本zstd-sys同时链接的需求。可尝试以下几种方法解决冲突:
1. 统一zstd-sys版本
找到能同时兼容actix-web和sled的zstd-sys版本,通过强制依赖来统一:
在Cargo.toml中添加指定版本的zstd-sys依赖:
[dependencies] # ... 保留原有依赖 zstd-sys = "1.6.1" # 或尝试2.0.4,验证哪个版本能同时适配两个主依赖
执行cargo update让所有依赖统一使用该版本,随后检查编译是否正常。
2. 禁用其中一个依赖的zstd特性
如果不需要sled的压缩功能,可直接关闭其compression特性:
sled = { version = "0.34.7", features = [] }
此举会让sled不再依赖zstd-sys,直接消除版本冲突。
3. 替换依赖或使用替代方案
- 检查actix-web是否存在不依赖zstd-sys的版本,或更换其他web框架;
- 替换sled为不依赖zstd的数据库实现。
4. 使用Cargo patch功能(进阶,不推荐日常使用)
若必须保留两个版本,可尝试修改其中一个zstd-sys的links字段:
- 将目标版本的zstd-sys源码复制到本地路径;
- 修改其Cargo.toml中的
links字段为唯一值(如zstd-sys-v1); - 在项目Cargo.toml中添加patch配置:
[patch.crates-io] zstd-sys = { path = "./path/to/patched-zstd-sys" }
该方法需自行维护patched版本,可能引发未定义行为,仅作为最后尝试手段。
内容的提问来源于stack exchange,提问作者blurt.washday

