You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Conan时spdlog与fmt版本冲突问题咨询

Conan版本冲突问题:spdlog/1.11.0与fmt/9.1.0依赖冲突

问题描述

我正在学习Conan,尝试把部分CMake文件从CPM、CMake内置的FetchContent_Declare切换到Conan使用。指定的包版本是fmt:9.1.0、spdlog:1.11.0,用CPM或FetchContent_Declare都能正常拉取构建运行,但用Conan时出现版本冲突错误:

ERROR: Version conflict: spdlog/1.11.0->fmt/10.0.0, ->fmt/9.1.0.

我的conanfile.py代码如下:

from conan import ConanFile
from conan.tools.cmake import CMakeToolchain

class CompressorReceipe(ConanFile):
    settings = "os", "compiler", "build_type", "arch"
    generators = "CMakeDeps"

    def requirements(self):
        self.requires("nlohmann_json/3.11.2")
        self.requires("spdlog/1.11.0")
        self.requires("fmt/9.1.0")
        self.requires("catch2/2.13.9")
        self.requires("cxxopts/3.1.1")

    def generate(self):
        tc = CMakeToolchain(self)
        tc.user_presets_path = False
        tc.generate()

我查了Conan中心的spdlog依赖信息,显示它依赖fmt/9.1.0而非错误里的10.0.0。测试升级fmt到10.0.0后能编译,但搞不懂为什么会出现这个冲突。我的环境是WSL下的Linux,编译器用的gcc。


问题原因与解决办法

原因分析

  1. 依赖版本范围规则:Conan中心的spdlog/1.11.0对fmt的依赖大概率不是严格锁定9.1.0,而是一个宽松的版本范围(比如>=9.1.0)。当你显式指定fmt/9.1.0时,可能存在其他间接依赖拉取了fmt/10.0.0,或者Conan的依赖解析逻辑优先选择了更高版本,导致冲突。
  2. 本地缓存干扰:如果之前本地Conan缓存里存过spdlog依赖fmt/10.0.0的记录,缓存会影响新的依赖解析结果。
  3. Conan版本差异:不同版本的Conan依赖解析逻辑可能有区别,比如旧版本的解析规则和Conan中心显示的依赖信息不匹配。

解决办法

  • 强制绑定spdlog的fmt版本:修改conanfile.py,给spdlog添加版本覆盖,强制它使用你指定的fmt/9.1.0:
    def requirements(self):
        self.requires("nlohmann_json/3.11.2")
        self.requires("spdlog/1.11.0", override="fmt")
        self.requires("fmt/9.1.0")
        self.requires("catch2/2.13.9")
        self.requires("cxxopts/3.1.1")
    
  • 清理本地缓存:执行conan cache clean命令清空缓存,再重新安装依赖,避免旧缓存干扰。
  • 排查完整依赖树:运行conan info .查看所有直接、间接依赖的版本,找出到底是哪个包拉取了fmt/10.0.0,针对性调整。

内容的提问来源于stack exchange,提问作者Ramin Toussi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 12:22:04