Rust稳定版与nightly版编译Substrate遇parity-db、prost-derive报错如何修复
Substrate编译双版本Rust错误修复方案
问题1:Rust 1.55.0稳定版下parity-db 0.3.1编译错误(错误码E0308)
错误原因
parity-db 0.3.1版本的madvise_random方法未声明返回值,Rust默认要求返回单元类型(),但方法实现末尾直接返回了std::result::Result类型的Ok(()),触发类型不匹配错误。
修复方案
- 升级项目依赖中的
parity-db版本到0.3.2及以上,该版本官方已修复此语法问题 - 若无法升级依赖,可在
Cargo.toml中添加补丁,将错误行的Ok(())修改为Ok(());(添加分号丢弃Result返回值)即可正常编译
问题2:Rust 1.57.0-nightly版本下prost-derive 0.7.0编译错误(错误码E0034)
错误原因
Rust 1.57及以上的nightly版本将intersperse方法加入了原生Iterator trait,而prost-derive 0.7.0依赖的Itertools三方库也提供了同名intersperse方法,编译器无法区分调用的实现来源,触发作用域冲突错误。
修复方案
- 升级项目依赖中的
prost-derive版本到0.8.0及以上,官方已适配高版本Rust的方法冲突问题 - 若需固定使用prost-derive 0.7.0版本,可指定使用1.57版本以下的nightly工具链,执行命令:
rustup override set nightly-2021-10-14,该版本Rust尚未将intersperse纳入原生Iterator trait,不存在冲突 - 临时方案:手动修改本地缓存的prost-derive源码,将调用
intersperse的行显式指定trait,比如改为Itertools::intersperse(迭代器实例, quote!(|))即可消除歧义
通用建议
优先使用对应Substrate版本官方指定的Rust工具链进行编译,可避免绝大多数跨版本兼容性问题。
内容的提问来源于stack exchange,提问作者Cuong Nguyen
相关产品推荐
相关产品推荐

