rustc与cargo版本正常,运行cargo build-bpf报resolver特性错误如何解决
问题根因
- 核心原因是
cargo build-bpf不会使用你系统安装的Rust工具链,它会调用Solana CLI内置的独立Rust工具链,该内置工具链的Cargo版本较低,不支持Cargo.toml中使用的resolver新特性。 - 你项目中显式依赖的
solana-program = "1.6.10"没有锁死间接依赖版本,Cargo默认按照语义化版本规则自动拉取了更高版本的solana-frozen-abi v1.7.9,这个版本的Cargo.toml使用了resolver特性,触发内置旧Cargo的解析报错。 - 你参考的Metaplex代码可正常编译是因为它的仓库中自带了
Cargo.lock文件,锁定了所有间接依赖的版本为1.6.x分支,不会自动拉取1.7.9版本的依赖包。
修复方案
- 方案1:降级Solana CLI版本到v1.6.10,和项目依赖的solana-program版本完全对齐,避免内置工具链和依赖版本不匹配的问题,完成降级后重新执行构建命令即可。
- 方案2:在你项目的
Cargo.toml末尾添加强制覆盖依赖的配置,锁死所有solana相关间接依赖的版本:
[patch.crates-io] solana-frozen-abi = { version = "=1.6.10" } solana-frozen-abi-macro = { version = "=1.6.10" } solana-program = { version = "=1.6.10" } solana-sdk = { version = "=1.6.10" } solana-program-test = { version = "=1.6.10" }
添加后重新执行构建命令,Cargo会强制使用1.6.10版本的所有solana相关依赖,不会拉取1.7.9版本。
- 方案3:将Metaplex代码库中的
Cargo.lock文件复制到你当前项目的根目录,再执行构建,Cargo会直接读取lock文件中锁定的依赖版本,不需要重新解析拉取新版本。
内容的提问来源于stack exchange,提问作者wxecqz123
相关产品推荐
相关产品推荐

